oauth2 2.0.12 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +352 -167
- data/CITATION.cff +20 -0
- data/CODE_OF_CONDUCT.md +24 -23
- data/CONTRIBUTING.md +103 -45
- data/FUNDING.md +77 -0
- data/LICENSE.txt +2 -2
- data/README.md +592 -350
- data/REEK +0 -0
- data/RUBOCOP.md +71 -0
- data/lib/oauth2/authenticator.rb +30 -1
- data/lib/oauth2/client.rb +3 -3
- data/lib/oauth2/error.rb +21 -3
- data/lib/oauth2/filtered_attributes.rb +21 -0
- data/lib/oauth2/version.rb +1 -1
- data/lib/oauth2.rb +36 -0
- data/sig/oauth2/access_token.rbs +25 -0
- data/sig/oauth2/authenticator.rbs +22 -0
- data/sig/oauth2/client.rbs +52 -0
- data/sig/oauth2/error.rbs +8 -0
- data/sig/oauth2/filtered_attributes.rbs +6 -0
- data/sig/oauth2/response.rbs +18 -0
- data/sig/oauth2/strategy.rbs +34 -0
- data/sig/oauth2/version.rbs +5 -0
- data/sig/oauth2.rbs +9 -0
- data.tar.gz.sig +0 -0
- metadata +69 -159
- metadata.gz.sig +0 -0
data/README.md
CHANGED
@@ -1,42 +1,72 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
1
|
+
[![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![oauth2 Logo by Chris Messina, CC BY-SA 3.0][🖼️oauth2-i]][🖼️oauth2]
|
2
|
+
|
3
|
+
[🖼️oauth2-i]: https://logos.galtzo.com/assets/images/oauth/oauth2/avatar-192px.svg
|
4
|
+
[🖼️oauth2]: https://github.com/ruby-oauth/oauth2
|
5
|
+
[🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
|
6
|
+
[🖼️ruby-lang]: https://www.ruby-lang.org/
|
7
|
+
[🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
|
8
|
+
[🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
|
9
|
+
|
10
|
+
# 🔐 OAuth 2.0 Authorization Framework
|
11
|
+
|
12
|
+
⭐️ including OAuth 2.1 draft spec & OpenID Connect (OIDC)
|
13
|
+
|
14
|
+
[![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls] [![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov] [![QLTY Maintainability][🔑qlty-mnti]][🔑qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Legacy][🚎4-lg-wfi]][🚎4-lg-wf] [![CI Unsupported][🚎7-us-wfi]][🚎7-us-wf] [![CI Ancient][🚎1-an-wfi]][🚎1-an-wf] [![CI Caboose is an absolute WAGON][🚎13-cbs-wfi]][🚎13-cbs-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL]
|
15
|
+
|
16
|
+
If ☝️ `ci_badges.map(&:color).detect { it != "green"}` [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
|
16
17
|
|
17
18
|
---
|
18
19
|
|
19
|
-
|
20
|
+
OTOH, if `ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
|
21
|
+
|
22
|
+
[![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
|
23
|
+
|
24
|
+
## 🌻 Synopsis
|
20
25
|
|
21
26
|
OAuth 2.0 is the industry-standard protocol for authorization.
|
22
27
|
OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications,
|
23
28
|
desktop applications, mobile phones, and living room devices.
|
24
29
|
This is a RubyGem for implementing OAuth 2.0 clients (not servers) in Ruby applications.
|
25
30
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
### Quick Example
|
32
|
+
|
33
|
+
<details>
|
34
|
+
<summary>Convert the following `curl` command into a token request using this gem...</summary>
|
35
|
+
|
36
|
+
```shell
|
37
|
+
curl --request POST \
|
38
|
+
--url 'https://login.microsoftonline.com/REDMOND_REDACTED/oauth2/token' \
|
39
|
+
--header 'content-type: application/x-www-form-urlencoded' \
|
40
|
+
--data grant_type=client_credentials \
|
41
|
+
--data client_id=REDMOND_CLIENT_ID \
|
42
|
+
--data client_secret=REDMOND_CLIENT_SECRET \
|
43
|
+
--data resource=REDMOND_RESOURCE_UUID
|
44
|
+
```
|
45
|
+
|
46
|
+
NOTE: In the ruby version below, certain params are passed to the `get_token` call, instead of the client creation.
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
OAuth2::Client.new(
|
50
|
+
"REDMOND_CLIENT_ID", # client_id
|
51
|
+
"REDMOND_CLIENT_SECRET", # client_secret
|
52
|
+
auth_scheme: :request_body, # Other modes are supported: :basic_auth, :tls_client_auth, :private_key_jwt
|
53
|
+
token_url: "oauth2/token", # relative path, except with leading `/`, then absolute path
|
54
|
+
site: "https://login.microsoftonline.com/REDMOND_REDACTED",
|
55
|
+
). # The base path for token_url when it is relative
|
56
|
+
client_credentials. # There are many other types to choose from!
|
57
|
+
get_token(resource: "REDMOND_RESOURCE_UUID")
|
58
|
+
```
|
59
|
+
|
60
|
+
NOTE: `header` - The content type specified in the `curl` is already the default!
|
61
|
+
|
62
|
+
</details>
|
33
63
|
|
34
64
|
### Upgrading Runtime Gem Dependencies
|
35
65
|
|
36
66
|
This project sits underneath a large portion of the authorization systems on the internet.
|
37
67
|
According to GitHub's project tracking, which I believe only reports on public projects,
|
38
|
-
[100,000+ projects](https://github.com/oauth
|
39
|
-
[500+ packages](https://github.com/oauth
|
68
|
+
[100,000+ projects](https://github.com/ruby-oauth/oauth2/network/dependents), and
|
69
|
+
[500+ packages](https://github.com/ruby-oauth/oauth2/network/dependents?dependent_type=PACKAGE) depend on this project.
|
40
70
|
|
41
71
|
That means it is painful for the Ruby community when this gem forces updates to its runtime dependencies.
|
42
72
|
|
@@ -48,6 +78,11 @@ What does that mean specifically for the runtime dependencies?
|
|
48
78
|
We have 100% test coverage of lines and branches, and this test suite runs across a large matrix
|
49
79
|
covering the latest patch for each of the following minor versions:
|
50
80
|
|
81
|
+
| 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 |
|
82
|
+
|------------------------------------------------|--------------------------------------------------------------------------------------|
|
83
|
+
| 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2](https://github.com/appraisal-rb/appraisal2) ✨ |
|
84
|
+
|
85
|
+
* Operating Systems: Linux, MacOS, Windows
|
51
86
|
* MRI Ruby @ v2.3, v2.4, v2.5, v2.6, v2.7, v3.0, v3.1, v3.2, v3.3, v3.4, HEAD
|
52
87
|
* NOTE: This gem will still install on ruby v2.2, but vanilla GitHub Actions no longer supports testing against it, so YMMV.
|
53
88
|
* JRuby @ v9.2, v9.3, v9.4, v10.0, HEAD
|
@@ -57,10 +92,10 @@ covering the latest patch for each of the following minor versions:
|
|
57
92
|
* gem `logger` @ v1.2, v1.5, v1.7, HEAD ⏩️ [ruby/logger](https://github.com/ruby/logger)
|
58
93
|
* gem `multi_xml` @ v0.5, v0.6, v0.7, HEAD ⏩️ [sferik/multi_xml](https://github.com/sferik/multi_xml)
|
59
94
|
* gem `rack` @ v1.2, v1.6, v2, v3, HEAD ⏩️ [rack/rack](https://github.com/rack/rack)
|
60
|
-
* gem `snaky_hash` @ v2, HEAD ⏩️ [oauth
|
61
|
-
* gem `version_gem` @ v1, HEAD ⏩️ [oauth
|
95
|
+
* gem `snaky_hash` @ v2, HEAD ⏩️ [ruby-oauth/snaky_hash](https://gitlab.com/ruby-oauth/snaky_hash)
|
96
|
+
* gem `version_gem` @ v1, HEAD ⏩️ [ruby-oauth/version_gem](https://gitlab.com/ruby-oauth/version_gem)
|
62
97
|
|
63
|
-
The last two were extracted from this gem. They are part of the `oauth
|
98
|
+
The last two were extracted from this gem. They are part of the `ruby-oauth` org,
|
64
99
|
and are developed in tight collaboration with this gem.
|
65
100
|
|
66
101
|
Also, where reasonable, tested against the runtime dependencies of those dependencies:
|
@@ -77,13 +112,7 @@ Also, where reasonable, tested against the runtime dependencies of those depende
|
|
77
112
|
|
78
113
|
[sv-pub-api]: #-is-platform-support-part-of-the-public-api
|
79
114
|
|
80
|
-
\* MIT license;
|
81
|
-
|
82
|
-
| 🚚 Test matrix brought to you by | 🔎 appraisal++ |
|
83
|
-
|----------------------------------|-------------------------------------------------------------------------|
|
84
|
-
| Adds back support for old Rubies | ✨ [appraisal PR #250](https://github.com/thoughtbot/appraisal/pull/250) |
|
85
|
-
| Adds support for `eval_gemfile` | ✨ [appraisal PR #248](https://github.com/thoughtbot/appraisal/pull/248) |
|
86
|
-
| Please review | my PRs! |
|
115
|
+
\* MIT license; The only guarantees I make are for [enterprise support](#enterprise-support).
|
87
116
|
|
88
117
|
<details>
|
89
118
|
<summary>Standard Library Dependencies</summary>
|
@@ -96,212 +125,112 @@ The various versions of each are tested via the Ruby test matrix, along with wha
|
|
96
125
|
* time
|
97
126
|
* logger (removed from stdlib in Ruby 3.5 so added as runtime dependency in v2.0.10)
|
98
127
|
|
99
|
-
If you use a gem version it should work fine!
|
128
|
+
If you use a gem version of a core Ruby library it should work fine!
|
100
129
|
|
101
130
|
</details>
|
102
131
|
|
103
|
-
|
104
|
-
|
105
|
-
Convert the following `curl` command into a token request using this gem...
|
106
|
-
|
107
|
-
```shell
|
108
|
-
curl --request POST \
|
109
|
-
--url 'https://login.microsoftonline.com/REDMOND_REDACTED/oauth2/token' \
|
110
|
-
--header 'content-type: application/x-www-form-urlencoded' \
|
111
|
-
--data grant_type=client_credentials \
|
112
|
-
--data client_id=REDMOND_CLIENT_ID \
|
113
|
-
--data client_secret=REDMOND_CLIENT_SECRET \
|
114
|
-
--data resource=REDMOND_RESOURCE_UUID
|
115
|
-
```
|
116
|
-
|
117
|
-
NOTE: In the ruby version below, certain params are passed to the `get_token` call, instead of the client creation.
|
118
|
-
|
119
|
-
```ruby
|
120
|
-
OAuth2::Client.new(
|
121
|
-
"REDMOND_CLIENT_ID", # client_id
|
122
|
-
"REDMOND_CLIENT_SECRET", # client_secret
|
123
|
-
auth_scheme: :request_body, # Other modes are supported: :basic_auth, :tls_client_auth, :private_key_jwt
|
124
|
-
token_url: "oauth2/token", # relative path, except with leading `/`, then absolute path
|
125
|
-
site: "https://login.microsoftonline.com/REDMOND_REDACTED",
|
126
|
-
). # The base path for token_url when it is relative
|
127
|
-
client_credentials. # There are many other types to choose from!
|
128
|
-
get_token(resource: "REDMOND_RESOURCE_UUID")
|
129
|
-
```
|
130
|
-
|
131
|
-
NOTE: `header` - The content type specified in the `curl` is already the default!
|
132
|
-
|
133
|
-
If any of the above makes you uncomfortable, you may be in the wrong place.
|
134
|
-
One of these might be what you are looking for:
|
132
|
+
If it seems like you are in the wrong place, you might try one of these:
|
135
133
|
|
136
134
|
* [OAuth 2.0 Spec][oauth2-spec]
|
137
135
|
* [doorkeeper gem][doorkeeper-gem] for OAuth 2.0 server/provider implementation.
|
138
136
|
* [oauth sibling gem][sibling-gem] for OAuth 1.0 implementations in Ruby.
|
139
137
|
|
140
138
|
[oauth2-spec]: https://oauth.net/2/
|
141
|
-
[sibling-gem]: https://gitlab.com/oauth
|
139
|
+
[sibling-gem]: https://gitlab.com/ruby-oauth/oauth
|
142
140
|
[doorkeeper-gem]: https://github.com/doorkeeper-gem/doorkeeper
|
143
141
|
|
144
142
|
## 💡 Info you can shake a stick at
|
145
143
|
|
146
|
-
| Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace]
|
147
|
-
|
148
|
-
| Works with JRuby |
|
149
|
-
| Works with Truffle Ruby |
|
150
|
-
| Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎4-lg-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎6-s-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]
|
151
|
-
| Works with MRI Ruby 2 | [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎
|
152
|
-
| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc]
|
153
|
-
| Documentation | [![
|
154
|
-
| Compliance | [![License: MIT][📄license-img]][📄license-ref] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver]
|
155
|
-
| Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji]
|
156
|
-
| Support | [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite] [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork] [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor]
|
157
|
-
|
|
158
|
-
|
|
159
|
-
| `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼♂️aboutme-img]][💖💁🏼♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
|
160
|
-
|
161
|
-
## 🚀 Release Documentation
|
162
|
-
|
163
|
-
### Version 2.0.x
|
144
|
+
| Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
|
145
|
+
|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
146
|
+
| Works with JRuby | ![JRuby 9.1 Compat][💎jruby-9.1i] ![JRuby 9.2 Compat][💎jruby-9.2i] ![JRuby 9.3 Compat][💎jruby-9.3i] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎10-j-wf] [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
|
147
|
+
| Works with Truffle Ruby | ![Truffle Ruby 22.3 Compat][💎truby-22.3i] ![Truffle Ruby 23.0 Compat][💎truby-23.0i] <br/> [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
|
148
|
+
| Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎4-lg-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎6-s-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
|
149
|
+
| Works with MRI Ruby 2 | ![Ruby 2.2 Compat][💎ruby-2.2i] <br/> [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎1-an-wf] [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎1-an-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎1-an-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎7-us-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎7-us-wf] |
|
150
|
+
| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
|
151
|
+
| Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![Wiki][📜wiki-img]][📜wiki] |
|
152
|
+
| Compliance | [![License: MIT][📄license-img]][📄license-ref] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
|
153
|
+
| Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
|
154
|
+
| Support | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork] [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor] |
|
155
|
+
| Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼♂️devto-img]][💖💁🏼♂️devto] |
|
156
|
+
| `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼♂️aboutme-img]][💖💁🏼♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
|
164
157
|
|
165
|
-
|
166
|
-
<summary>2.0.x CHANGELOG and README</summary>
|
167
|
-
|
168
|
-
| Version | Release Date | CHANGELOG | README |
|
169
|
-
|---------|--------------|---------------------------------------|---------------------------------|
|
170
|
-
| 2.0.12 | 2025-05-31 | [v2.0.12 CHANGELOG][2.0.12-changelog] | [v2.0.12 README][2.0.12-readme] |
|
171
|
-
| 2.0.11 | 2025-05-23 | [v2.0.11 CHANGELOG][2.0.11-changelog] | [v2.0.11 README][2.0.11-readme] |
|
172
|
-
| 2.0.10 | 2025-05-17 | [v2.0.10 CHANGELOG][2.0.10-changelog] | [v2.0.10 README][2.0.10-readme] |
|
173
|
-
| 2.0.9 | 2022-09-16 | [v2.0.9 CHANGELOG][2.0.9-changelog] | [v2.0.9 README][2.0.9-readme] |
|
174
|
-
| 2.0.8 | 2022-09-01 | [v2.0.8 CHANGELOG][2.0.8-changelog] | [v2.0.8 README][2.0.8-readme] |
|
175
|
-
| 2.0.7 | 2022-08-22 | [v2.0.7 CHANGELOG][2.0.7-changelog] | [v2.0.7 README][2.0.7-readme] |
|
176
|
-
| 2.0.6 | 2022-07-13 | [v2.0.6 CHANGELOG][2.0.6-changelog] | [v2.0.6 README][2.0.6-readme] |
|
177
|
-
| 2.0.5 | 2022-07-07 | [v2.0.5 CHANGELOG][2.0.5-changelog] | [v2.0.5 README][2.0.5-readme] |
|
178
|
-
| 2.0.4 | 2022-07-01 | [v2.0.4 CHANGELOG][2.0.4-changelog] | [v2.0.4 README][2.0.4-readme] |
|
179
|
-
| 2.0.3 | 2022-06-28 | [v2.0.3 CHANGELOG][2.0.3-changelog] | [v2.0.3 README][2.0.3-readme] |
|
180
|
-
| 2.0.2 | 2022-06-24 | [v2.0.2 CHANGELOG][2.0.2-changelog] | [v2.0.2 README][2.0.2-readme] |
|
181
|
-
| 2.0.1 | 2022-06-22 | [v2.0.1 CHANGELOG][2.0.1-changelog] | [v2.0.1 README][2.0.1-readme] |
|
182
|
-
| 2.0.0 | 2022-06-21 | [v2.0.0 CHANGELOG][2.0.0-changelog] | [v2.0.0 README][2.0.0-readme] |
|
183
|
-
</details>
|
158
|
+
### Compatibility
|
184
159
|
|
185
|
-
|
186
|
-
[2.0.11-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#2011---2025-05-23
|
187
|
-
[2.0.10-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#2010---2025-05-17
|
188
|
-
[2.0.9-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#209---2022-09-16
|
189
|
-
[2.0.8-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#208---2022-09-01
|
190
|
-
[2.0.7-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#207---2022-08-22
|
191
|
-
[2.0.6-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#206---2022-07-13
|
192
|
-
[2.0.5-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#205---2022-07-07
|
193
|
-
[2.0.4-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#204---2022-07-01
|
194
|
-
[2.0.3-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#203---2022-06-28
|
195
|
-
[2.0.2-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#202---2022-06-24
|
196
|
-
[2.0.1-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#201---2022-06-22
|
197
|
-
[2.0.0-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#200---2022-06-21
|
198
|
-
|
199
|
-
[2.0.12-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.12/README.md
|
200
|
-
[2.0.11-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.11/README.md
|
201
|
-
[2.0.10-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.10/README.md
|
202
|
-
[2.0.9-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.9/README.md
|
203
|
-
[2.0.8-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.8/README.md
|
204
|
-
[2.0.7-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.7/README.md
|
205
|
-
[2.0.6-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.6/README.md
|
206
|
-
[2.0.5-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.5/README.md
|
207
|
-
[2.0.4-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.4/README.md
|
208
|
-
[2.0.3-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.3/README.md
|
209
|
-
[2.0.2-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.2/README.md
|
210
|
-
[2.0.1-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.1/README.md
|
211
|
-
[2.0.0-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v2.0.0/README.md
|
212
|
-
|
213
|
-
### Older Releases
|
160
|
+
Compatible with Ruby 2.3+, and concordant releases of JRuby, and TruffleRuby.
|
214
161
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
| Version | Release Date | CHANGELOG | README |
|
219
|
-
|---------|--------------|---------------------------------------|---------------------------------|
|
220
|
-
| 1.4.11 | Sep 16, 2022 | [v1.4.11 CHANGELOG][1.4.11-changelog] | [v1.4.11 README][1.4.11-readme] |
|
221
|
-
| 1.4.10 | Jul 1, 2022 | [v1.4.10 CHANGELOG][1.4.10-changelog] | [v1.4.10 README][1.4.10-readme] |
|
222
|
-
| 1.4.9 | Feb 20, 2022 | [v1.4.9 CHANGELOG][1.4.9-changelog] | [v1.4.9 README][1.4.9-readme] |
|
223
|
-
| 1.4.8 | Feb 18, 2022 | [v1.4.8 CHANGELOG][1.4.8-changelog] | [v1.4.8 README][1.4.8-readme] |
|
224
|
-
| 1.4.7 | Mar 19, 2021 | [v1.4.7 CHANGELOG][1.4.7-changelog] | [v1.4.7 README][1.4.7-readme] |
|
225
|
-
| 1.4.6 | Mar 19, 2021 | [v1.4.6 CHANGELOG][1.4.6-changelog] | [v1.4.6 README][1.4.6-readme] |
|
226
|
-
| 1.4.5 | Mar 18, 2021 | [v1.4.5 CHANGELOG][1.4.5-changelog] | [v1.4.5 README][1.4.5-readme] |
|
227
|
-
| 1.4.4 | Feb 12, 2020 | [v1.4.4 CHANGELOG][1.4.4-changelog] | [v1.4.4 README][1.4.4-readme] |
|
228
|
-
| 1.4.3 | Jan 29, 2020 | [v1.4.3 CHANGELOG][1.4.3-changelog] | [v1.4.3 README][1.4.3-readme] |
|
229
|
-
| 1.4.2 | Oct 1, 2019 | [v1.4.2 CHANGELOG][1.4.2-changelog] | [v1.4.2 README][1.4.2-readme] |
|
230
|
-
| 1.4.1 | Oct 13, 2018 | [v1.4.1 CHANGELOG][1.4.1-changelog] | [v1.4.1 README][1.4.1-readme] |
|
231
|
-
| 1.4.0 | Jun 9, 2017 | [v1.4.0 CHANGELOG][1.4.0-changelog] | [v1.4.0 README][1.4.0-readme] |
|
232
|
-
</details>
|
162
|
+
| 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 |
|
163
|
+
|------------------------------------------------|-------------------------------------------------------------------------------------|
|
164
|
+
| 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
|
233
165
|
|
234
|
-
|
235
|
-
[1.4.10-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#1410---2022-07-01
|
236
|
-
[1.4.9-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#149---2022-02-20
|
237
|
-
[1.4.8-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#148---2022-02-18
|
238
|
-
[1.4.7-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#147---2021-03-19
|
239
|
-
[1.4.6-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#146---2021-03-19
|
240
|
-
[1.4.5-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#145---2021-03-18
|
241
|
-
[1.4.4-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#144---2020-02-12
|
242
|
-
[1.4.3-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#143---2020-01-29
|
243
|
-
[1.4.2-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#142---2019-10-01
|
244
|
-
[1.4.1-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#141---2018-10-13
|
245
|
-
[1.4.0-changelog]: https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md?ref_type=heads#140---2017-06-09
|
246
|
-
|
247
|
-
[1.4.11-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.11/README.md
|
248
|
-
[1.4.10-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.10/README.md
|
249
|
-
[1.4.9-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.9/README.md
|
250
|
-
[1.4.8-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.8/README.md
|
251
|
-
[1.4.7-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.7/README.md
|
252
|
-
[1.4.6-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.6/README.md
|
253
|
-
[1.4.5-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.5/README.md
|
254
|
-
[1.4.4-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.4/README.md
|
255
|
-
[1.4.3-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.3/README.md
|
256
|
-
[1.4.2-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.2/README.md
|
257
|
-
[1.4.1-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.1/README.md
|
258
|
-
[1.4.0-readme]: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.0/README.md
|
166
|
+
### Federated DVCS
|
259
167
|
|
260
168
|
<details>
|
261
|
-
<summary>
|
169
|
+
<summary>Find this repo on other forges (Coming soon!)</summary>
|
170
|
+
|
171
|
+
| Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
|
172
|
+
|-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
|
173
|
+
| 🧪 [ruby-oauth/oauth2 on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜wiki] | 🏀 Tiny Matrix | ➖ |
|
174
|
+
| 🧊 [ruby-oauth/oauth2 on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
|
175
|
+
| 🐙 [ruby-oauth/oauth2 on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | ➖ | 💯 Full Matrix | [💚][gh-discussions] |
|
176
|
+
| 🤼 [OAuth Ruby Google Group][⛳gg-discussions] | "Active" | ➖ | ➖ | ➖ | ➖ | [💚][⛳gg-discussions] |
|
177
|
+
| 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
|
262
178
|
|
263
|
-
| Version | Release Date | Readme |
|
264
|
-
|----------|--------------|----------------------------------------------------------|
|
265
|
-
| 1.3.1 | Mar 3, 2017 | https://gitlab.com/oauth-xx/oauth2/-/blob/v1.3.1/README.md |
|
266
|
-
| 1.3.0 | Dec 27, 2016 | https://gitlab.com/oauth-xx/oauth2/-/blob/v1.3.0/README.md |
|
267
179
|
</details>
|
268
180
|
|
181
|
+
[gh-discussions]: https://github.com/ruby-oauth/oauth2/discussions
|
182
|
+
|
183
|
+
### Enterprise Support [](https://tidelift.com/subscription/pkg/rubygems-oauth2?utm_source=rubygems-oauth2&utm_medium=referral&utm_campaign=readme)
|
184
|
+
|
269
185
|
<details>
|
270
|
-
<summary
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
186
|
+
<summary>Need enterprise-level guarantees?</summary>
|
187
|
+
|
188
|
+
[![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
|
189
|
+
|
190
|
+
- 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
|
191
|
+
- 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
|
192
|
+
- 💡Tidelift pays maintainers to maintain the software you depend on!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
|
193
|
+
|
194
|
+
Alternatively:
|
195
|
+
|
196
|
+
- [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
|
197
|
+
- [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork]
|
198
|
+
- [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor]
|
199
|
+
|
278
200
|
</details>
|
279
201
|
|
280
202
|
## ✨ Installation
|
281
203
|
|
282
204
|
Install the gem and add to the application's Gemfile by executing:
|
283
205
|
|
284
|
-
|
206
|
+
```console
|
207
|
+
bundle add oauth2
|
208
|
+
```
|
285
209
|
|
286
210
|
If bundler is not being used to manage dependencies, install the gem by executing:
|
287
211
|
|
288
|
-
|
212
|
+
```console
|
213
|
+
gem install oauth2
|
214
|
+
```
|
289
215
|
|
290
216
|
### 🔒 Secure Installation
|
291
217
|
|
292
|
-
|
218
|
+
<details>
|
219
|
+
<summary>For Medium or High Security Installations</summary>
|
220
|
+
|
221
|
+
This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
|
293
222
|
[stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
|
294
223
|
by following the instructions below.
|
295
224
|
|
296
225
|
Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
|
297
226
|
|
298
|
-
```
|
299
|
-
gem cert --add <(curl -Ls https://raw.github.com/
|
227
|
+
```console
|
228
|
+
gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
|
300
229
|
```
|
301
230
|
|
302
231
|
You only need to do that once. Then proceed to install with:
|
303
232
|
|
304
|
-
```
|
233
|
+
```console
|
305
234
|
gem install oauth2 -P MediumSecurity
|
306
235
|
```
|
307
236
|
|
@@ -311,12 +240,14 @@ This is necessary because not all of `oauth2`’s dependencies are signed, so we
|
|
311
240
|
|
312
241
|
If you want to up your security game full-time:
|
313
242
|
|
314
|
-
```
|
243
|
+
```console
|
315
244
|
bundle config set --global trust-policy MediumSecurity
|
316
245
|
```
|
317
246
|
|
318
247
|
NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
|
319
248
|
|
249
|
+
</details>
|
250
|
+
|
320
251
|
## OAuth2 for Enterprise
|
321
252
|
|
322
253
|
Available as part of the Tidelift Subscription.
|
@@ -337,11 +268,11 @@ For more see [SECURITY.md][🔐security].
|
|
337
268
|
- Works with Ruby versions >= 2.2
|
338
269
|
- Drop support for the expired MAC Draft (all versions)
|
339
270
|
- Support IETF rfc7515 JSON Web Signature - JWS (since v2.0.12)
|
340
|
-
|
271
|
+
- Support JWT `kid` for key discovery and management
|
341
272
|
- Support IETF rfc7523 JWT Bearer Tokens (since v2.0.0)
|
342
273
|
- Support IETF rfc7231 Relative Location in Redirect (since v2.0.0)
|
343
274
|
- Support IETF rfc6749 Don't set oauth params when nil (since v2.0.0)
|
344
|
-
- Support IETF rfc7009 Token Revocation (since v2.0.10)
|
275
|
+
- Support IETF rfc7009 Token Revocation (since v2.0.10, updated in v2.0.13 to support revocation via URL-encoded parameters)
|
345
276
|
- Support [OIDC 1.0 Private Key JWT](https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication); based on the OAuth JWT assertion specification [(RFC 7523)](https://tools.ietf.org/html/rfc7523)
|
346
277
|
- Support new formats, including from [jsonapi.org](http://jsonapi.org/format/): `application/vdn.api+json`, `application/vnd.collection+json`, `application/hal+json`, `application/problem+json`
|
347
278
|
- Adds option to `OAuth2::Client#get_token`:
|
@@ -349,14 +280,14 @@ For more see [SECURITY.md][🔐security].
|
|
349
280
|
- Adds option to `OAuth2::AccessToken#initialize`:
|
350
281
|
- `:expires_latency` (`nil`); number of seconds by which AccessToken validity will be reduced to offset latency
|
351
282
|
- By default, keys are transformed to snake case.
|
352
|
-
|
353
|
-
|
354
|
-
|
283
|
+
- Original keys will still work as previously, in most scenarios, thanks to [snaky_hash][snaky_hash] gem.
|
284
|
+
- However, this is a _breaking_ change if you rely on `response.parsed.to_h` to retain the original case, and the original wasn't snake case, as the keys in the result will be snake case.
|
285
|
+
- As of version 2.0.4 you can turn key transformation off with the `snaky: false` option.
|
355
286
|
- By default, the `:auth_scheme` is now `:basic_auth` (instead of `:request_body`)
|
356
|
-
|
357
|
-
- [... A lot more](https://gitlab.com/oauth
|
287
|
+
- Third-party strategies and gems may need to be updated if a provider was requiring client id/secret in the request body
|
288
|
+
- [... A lot more](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/CHANGELOG.md#200-2022-06-21-tag)
|
358
289
|
|
359
|
-
[snaky_hash]: https://gitlab.com/oauth
|
290
|
+
[snaky_hash]: https://gitlab.com/ruby-oauth/snaky_hash
|
360
291
|
|
361
292
|
## Compatibility
|
362
293
|
|
@@ -372,7 +303,7 @@ This gem is tested against MRI, JRuby, and Truffleruby.
|
|
372
303
|
Each of those has varying versions that target a specific version of MRI Ruby.
|
373
304
|
This gem should work in the just-listed Ruby engines according to the targeted MRI compatibility in the table below.
|
374
305
|
If you would like to add support for additional engines,
|
375
|
-
|
306
|
+
see [gemfiles/README.md](gemfiles/README.md), then submit a PR to the correct maintenance branch as according to the table below.
|
376
307
|
</details>
|
377
308
|
|
378
309
|
<details>
|
@@ -401,9 +332,7 @@ of a major release, support for that Ruby version may be dropped.
|
|
401
332
|
NOTE: The 1.4 series will only receive critical security updates.
|
402
333
|
See [SECURITY.md][🔐security].
|
403
334
|
|
404
|
-
##
|
405
|
-
|
406
|
-
### Global Configuration
|
335
|
+
## ⚙️ Configuration
|
407
336
|
|
408
337
|
You can turn on additional warnings.
|
409
338
|
|
@@ -430,6 +359,8 @@ You'll likely need to do some source diving.
|
|
430
359
|
This gem has 100% test coverage for lines and branches, so the specs are a great place to look for ideas.
|
431
360
|
If you have time and energy please contribute to the documentation!
|
432
361
|
|
362
|
+
## 🔧 Basic Usage
|
363
|
+
|
433
364
|
### `authorize_url` and `token_url` are on site root (Just Works!)
|
434
365
|
|
435
366
|
```ruby
|
@@ -495,32 +426,38 @@ As of v2.0.11, if you need to serialize the parsed result, you can!
|
|
495
426
|
|
496
427
|
There are two ways to do this, globally, or discretely. The discrete way is recommended.
|
497
428
|
|
498
|
-
|
429
|
+
##### Global Serialization Config
|
430
|
+
|
431
|
+
Globally configure `SnakyHash::StringKeyed` to use the serializer. Put this in your code somewhere reasonable (like an initializer for Rails).
|
499
432
|
|
500
|
-
|
433
|
+
```ruby
|
501
434
|
SnakyHash::StringKeyed.class_eval do
|
502
435
|
extend SnakyHash::Serializer
|
503
436
|
end
|
504
|
-
|
437
|
+
```
|
505
438
|
|
506
|
-
|
439
|
+
##### Discrete Serialization Config
|
507
440
|
|
508
|
-
|
441
|
+
Discretely configure a custom Snaky Hash class to use the serializer.
|
442
|
+
|
443
|
+
```ruby
|
509
444
|
class MySnakyHash < SnakyHash::StringKeyed
|
510
445
|
# Give this hash class `dump` and `load` abilities!
|
511
446
|
extend SnakyHash::Serializer
|
512
447
|
end
|
513
448
|
|
514
|
-
|
449
|
+
# And tell your client to use the custom class in each call:
|
515
450
|
client = OAuth2::Client.new("client_id", "client_secret", site: "https://example.org/oauth2")
|
516
451
|
token = client.get_token({snaky_hash_klass: MySnakyHash})
|
517
|
-
|
452
|
+
```
|
518
453
|
|
519
454
|
##### Serialization Extensions
|
520
455
|
|
456
|
+
These extensions work regardless of whether you used the global or discrete config above.
|
457
|
+
|
521
458
|
There are a few hacks you may need in your class to support Ruby < 2.4.2 or < 2.6.
|
522
459
|
They are likely not needed if you are on a newer Ruby.
|
523
|
-
See
|
460
|
+
See [response_spec.rb](https://github.com/ruby-oauth/oauth2/blob/main/spec/oauth2/response_spec.rb) if you need to study the hacks for older Rubies.
|
524
461
|
|
525
462
|
```ruby
|
526
463
|
class MySnakyHash < SnakyHash::StringKeyed
|
@@ -576,7 +513,7 @@ class MySnakyHash < SnakyHash::StringKeyed
|
|
576
513
|
end
|
577
514
|
```
|
578
515
|
|
579
|
-
See
|
516
|
+
See [response_spec.rb](https://github.com/ruby-oauth/oauth2/blob/main/spec/oauth2/response_spec.rb), or the [ruby-oauth/snaky_hash](https://gitlab.com/ruby-oauth/snaky_hash) gem for more ideas.
|
580
517
|
|
581
518
|
#### What if I hate snakes and/or indifference?
|
582
519
|
|
@@ -619,7 +556,7 @@ The `AccessToken` methods `#get`, `#post`, `#put` and `#delete` and the generic
|
|
619
556
|
will return an instance of the #OAuth2::Response class.
|
620
557
|
|
621
558
|
This instance contains a `#parsed` method that will parse the response body and
|
622
|
-
return a Hash-like [`SnakyHash::StringKeyed`](https://gitlab.com/oauth
|
559
|
+
return a Hash-like [`SnakyHash::StringKeyed`](https://gitlab.com/ruby-oauth/snaky_hash/-/blob/main/lib/snaky_hash/string_keyed.rb) if the `Content-Type` is `application/x-www-form-urlencoded` or if
|
623
560
|
the body is a JSON object. It will return an Array if the body is a JSON
|
624
561
|
array. Otherwise, it will return the original body string.
|
625
562
|
|
@@ -649,11 +586,11 @@ Response instance will contain the `OAuth2::Error` instance.
|
|
649
586
|
|
650
587
|
Currently, the Authorization Code, Implicit, Resource Owner Password Credentials, Client Credentials, and Assertion
|
651
588
|
authentication grant types have helper strategy classes that simplify client
|
652
|
-
use. They are available via the [`#auth_code`](https://gitlab.com/oauth
|
653
|
-
[`#implicit`](https://gitlab.com/oauth
|
654
|
-
[`#password`](https://gitlab.com/oauth
|
655
|
-
[`#client_credentials`](https://gitlab.com/oauth
|
656
|
-
[`#assertion`](https://gitlab.com/oauth
|
589
|
+
use. They are available via the [`#auth_code`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/auth_code.rb),
|
590
|
+
[`#implicit`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/implicit.rb),
|
591
|
+
[`#password`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/password.rb),
|
592
|
+
[`#client_credentials`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/client_credentials.rb), and
|
593
|
+
[`#assertion`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/assertion.rb) methods respectively.
|
657
594
|
|
658
595
|
These aren't full examples, but demonstrative of the differences between usage for each strategy.
|
659
596
|
```ruby
|
@@ -694,6 +631,260 @@ access = client.auth_code.get_token("code_value", redirect_uri: "http://localhos
|
|
694
631
|
You can always use the `#request` method on the `OAuth2::Client` instance to make
|
695
632
|
requests for tokens for any Authentication grant type.
|
696
633
|
|
634
|
+
## 📘 Comprehensive Usage
|
635
|
+
|
636
|
+
### Common Flows (end-to-end)
|
637
|
+
|
638
|
+
- Authorization Code (server-side web app):
|
639
|
+
|
640
|
+
```ruby
|
641
|
+
require "oauth2"
|
642
|
+
client = OAuth2::Client.new(
|
643
|
+
ENV["CLIENT_ID"],
|
644
|
+
ENV["CLIENT_SECRET"],
|
645
|
+
site: "https://provider.example.com",
|
646
|
+
redirect_uri: "https://my.app.example.com/oauth/callback",
|
647
|
+
)
|
648
|
+
|
649
|
+
# Step 1: redirect user to consent
|
650
|
+
state = SecureRandom.hex(16)
|
651
|
+
auth_url = client.auth_code.authorize_url(scope: "openid profile email", state: state)
|
652
|
+
# redirect_to auth_url
|
653
|
+
|
654
|
+
# Step 2: handle the callback
|
655
|
+
# params[:code], params[:state]
|
656
|
+
raise "state mismatch" unless params[:state] == state
|
657
|
+
access = client.auth_code.get_token(params[:code])
|
658
|
+
|
659
|
+
# Step 3: call APIs
|
660
|
+
profile = access.get("/api/v1/me").parsed
|
661
|
+
```
|
662
|
+
|
663
|
+
- Client Credentials (machine-to-machine):
|
664
|
+
|
665
|
+
```ruby
|
666
|
+
client = OAuth2::Client.new(ENV["CLIENT_ID"], ENV["CLIENT_SECRET"], site: "https://provider.example.com")
|
667
|
+
access = client.client_credentials.get_token(audience: "https://api.example.com")
|
668
|
+
resp = access.get("/v1/things")
|
669
|
+
```
|
670
|
+
|
671
|
+
- Resource Owner Password (legacy; avoid when possible):
|
672
|
+
|
673
|
+
```ruby
|
674
|
+
access = client.password.get_token("jdoe", "s3cret", scope: "read")
|
675
|
+
```
|
676
|
+
|
677
|
+
### Refresh Tokens
|
678
|
+
|
679
|
+
When the server issues a refresh_token, you can refresh manually or implement an auto-refresh wrapper.
|
680
|
+
|
681
|
+
- Manual refresh:
|
682
|
+
|
683
|
+
```ruby
|
684
|
+
if access.expired?
|
685
|
+
access = access.refresh
|
686
|
+
end
|
687
|
+
```
|
688
|
+
|
689
|
+
- Auto-refresh wrapper pattern:
|
690
|
+
|
691
|
+
```ruby
|
692
|
+
class AutoRefreshingToken
|
693
|
+
def initialize(token_provider, store: nil)
|
694
|
+
@token = token_provider
|
695
|
+
@store = store # e.g., something that responds to read/write for token data
|
696
|
+
end
|
697
|
+
|
698
|
+
def with(&blk)
|
699
|
+
tok = ensure_fresh!
|
700
|
+
blk ? blk.call(tok) : tok
|
701
|
+
rescue OAuth2::Error => e
|
702
|
+
# If a 401 suggests token invalidation, try one refresh and retry once
|
703
|
+
if e.response && e.response.status == 401 && @token.refresh_token
|
704
|
+
@token = @token.refresh
|
705
|
+
@store.write(@token.to_hash) if @store
|
706
|
+
retry
|
707
|
+
end
|
708
|
+
raise
|
709
|
+
end
|
710
|
+
|
711
|
+
private
|
712
|
+
|
713
|
+
def ensure_fresh!
|
714
|
+
if @token.expired? && @token.refresh_token
|
715
|
+
@token = @token.refresh
|
716
|
+
@store.write(@token.to_hash) if @store
|
717
|
+
end
|
718
|
+
@token
|
719
|
+
end
|
720
|
+
end
|
721
|
+
|
722
|
+
# usage
|
723
|
+
keeper = AutoRefreshingToken.new(access)
|
724
|
+
keeper.with { |tok| tok.get("/v1/protected") }
|
725
|
+
```
|
726
|
+
|
727
|
+
Persist the token across processes using `AccessToken#to_hash` and `AccessToken.from_hash(client, hash)`.
|
728
|
+
|
729
|
+
### Token Revocation (RFC 7009)
|
730
|
+
|
731
|
+
You can revoke either the access token or the refresh token.
|
732
|
+
|
733
|
+
```ruby
|
734
|
+
# Revoke the current access token
|
735
|
+
access.revoke(token_type_hint: :access_token)
|
736
|
+
|
737
|
+
# Or explicitly revoke the refresh token (often also invalidates associated access tokens)
|
738
|
+
access.revoke(token_type_hint: :refresh_token)
|
739
|
+
```
|
740
|
+
|
741
|
+
### Client Configuration Tips
|
742
|
+
|
743
|
+
- Authentication schemes for the token request:
|
744
|
+
|
745
|
+
```ruby
|
746
|
+
OAuth2::Client.new(
|
747
|
+
id,
|
748
|
+
secret,
|
749
|
+
site: "https://provider.example.com",
|
750
|
+
auth_scheme: :basic_auth, # default. Alternatives: :request_body, :tls_client_auth, :private_key_jwt
|
751
|
+
)
|
752
|
+
```
|
753
|
+
|
754
|
+
- Faraday connection, timeouts, proxy, custom adapter/middleware:
|
755
|
+
|
756
|
+
```ruby
|
757
|
+
client = OAuth2::Client.new(
|
758
|
+
id,
|
759
|
+
secret,
|
760
|
+
site: "https://provider.example.com",
|
761
|
+
connection_opts: {
|
762
|
+
request: {open_timeout: 5, timeout: 15},
|
763
|
+
proxy: ENV["HTTPS_PROXY"],
|
764
|
+
ssl: {verify: true},
|
765
|
+
},
|
766
|
+
) do |faraday|
|
767
|
+
faraday.request(:url_encoded)
|
768
|
+
# faraday.response :logger, Logger.new($stdout) # see OAUTH_DEBUG below
|
769
|
+
faraday.adapter(:net_http_persistent) # or any Faraday adapter you need
|
770
|
+
end
|
771
|
+
```
|
772
|
+
|
773
|
+
- Redirection: The library follows up to `max_redirects` (default 5). You can override per-client via `options[:max_redirects]`.
|
774
|
+
|
775
|
+
### Handling Responses and Errors
|
776
|
+
|
777
|
+
- Parsing:
|
778
|
+
|
779
|
+
```ruby
|
780
|
+
resp = access.get("/v1/thing")
|
781
|
+
resp.status # Integer
|
782
|
+
resp.headers # Hash
|
783
|
+
resp.body # String
|
784
|
+
resp.parsed # SnakyHash::StringKeyed or Array when JSON array
|
785
|
+
```
|
786
|
+
|
787
|
+
- Error handling:
|
788
|
+
|
789
|
+
```ruby
|
790
|
+
begin
|
791
|
+
access.get("/v1/forbidden")
|
792
|
+
rescue OAuth2::Error => e
|
793
|
+
e.code # OAuth2 error code (when present)
|
794
|
+
e.description # OAuth2 error description (when present)
|
795
|
+
e.response # OAuth2::Response (full access to status/headers/body)
|
796
|
+
end
|
797
|
+
```
|
798
|
+
|
799
|
+
- Disable raising on 4xx/5xx to inspect the response yourself:
|
800
|
+
|
801
|
+
```ruby
|
802
|
+
client = OAuth2::Client.new(id, secret, site: site, raise_errors: false)
|
803
|
+
res = client.request(:get, "/v1/maybe-errors")
|
804
|
+
if res.status == 429
|
805
|
+
sleep res.headers["retry-after"].to_i
|
806
|
+
end
|
807
|
+
```
|
808
|
+
|
809
|
+
### Making Raw Token Requests
|
810
|
+
|
811
|
+
If a provider requires non-standard parameters or headers, you can call `client.get_token` directly:
|
812
|
+
|
813
|
+
```ruby
|
814
|
+
access = client.get_token({
|
815
|
+
grant_type: "client_credentials",
|
816
|
+
audience: "https://api.example.com",
|
817
|
+
headers: {"X-Custom" => "value"},
|
818
|
+
parse: :json, # override parsing
|
819
|
+
})
|
820
|
+
```
|
821
|
+
|
822
|
+
### OpenID Connect (OIDC) Notes
|
823
|
+
|
824
|
+
- If the token response includes an `id_token` (a JWT), this gem surfaces it but does not validate the signature. Use a JWT library and your provider's JWKs to verify it.
|
825
|
+
- For private_key_jwt client authentication, provide `auth_scheme: :private_key_jwt` and ensure your key configuration matches the provider requirements.
|
826
|
+
|
827
|
+
### Debugging
|
828
|
+
|
829
|
+
- Set environment variable `OAUTH_DEBUG=true` to enable verbose Faraday logging (uses the client-provided logger).
|
830
|
+
- To mirror a working curl request, ensure you set the same auth scheme, params, and content type. The Quick Example at the top shows a curl-to-ruby translation.
|
831
|
+
|
832
|
+
---
|
833
|
+
|
834
|
+
## 🦷 FLOSS Funding
|
835
|
+
|
836
|
+
While ruby-oauth tools are free software and will always be, the project would benefit immensely from some funding.
|
837
|
+
Raising a monthly budget of... "dollars" would make the project more sustainable.
|
838
|
+
|
839
|
+
We welcome both individual and corporate sponsors! We also offer a
|
840
|
+
wide array of funding channels to account for your preferences
|
841
|
+
(although currently [Open Collective][🖇osc] is our preferred funding platform).
|
842
|
+
|
843
|
+
**If you're working in a company that's making significant use of ruby-oauth tools we'd
|
844
|
+
appreciate it if you suggest to your company to become a ruby-oauth sponsor.**
|
845
|
+
|
846
|
+
You can support the development of ruby-oauth tools via
|
847
|
+
[GitHub Sponsors][🖇sponsor],
|
848
|
+
[Liberapay][⛳liberapay],
|
849
|
+
[PayPal][🖇paypal],
|
850
|
+
[Open Collective][🖇osc]
|
851
|
+
and [Tidelift][🏙️entsup-tidelift].
|
852
|
+
|
853
|
+
| 📍 NOTE |
|
854
|
+
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
855
|
+
| If doing a sponsorship in the form of donation is problematic for your company <br/> from an accounting standpoint, we'd recommend the use of Tidelift, <br/> where you can get a support-like subscription instead. |
|
856
|
+
|
857
|
+
### Open Collective for Individuals
|
858
|
+
|
859
|
+
<!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
|
860
|
+
No backers yet. Be the first!
|
861
|
+
<!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
|
862
|
+
|
863
|
+
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/ruby-oauth#backer)]
|
864
|
+
|
865
|
+
### Open Collective for Organizations
|
866
|
+
|
867
|
+
<!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
|
868
|
+
No sponsors yet. Be the first!
|
869
|
+
<!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
|
870
|
+
|
871
|
+
Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/ruby-oauth#sponsor)]
|
872
|
+
|
873
|
+
### Another way to support open-source
|
874
|
+
|
875
|
+
> How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
|
876
|
+
>—Anne Frank
|
877
|
+
|
878
|
+
I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions — totaling 79 hours of FLOSS coding over just the past seven days, a pretty regular week for me. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈 cats).
|
879
|
+
|
880
|
+
If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
|
881
|
+
|
882
|
+
I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
|
883
|
+
|
884
|
+
**[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
|
885
|
+
|
886
|
+
[![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
|
887
|
+
|
697
888
|
## 🔐 Security
|
698
889
|
|
699
890
|
See [SECURITY.md][🔐security].
|
@@ -701,7 +892,7 @@ See [SECURITY.md][🔐security].
|
|
701
892
|
## 🤝 Contributing
|
702
893
|
|
703
894
|
If you need some ideas of where to help, you could work on adding more code coverage,
|
704
|
-
or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
|
895
|
+
or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
|
705
896
|
or use the gem and think about how it could be better.
|
706
897
|
|
707
898
|
We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
|
@@ -715,12 +906,13 @@ See [CONTRIBUTING.md][🤝contributing].
|
|
715
906
|
### Code Coverage
|
716
907
|
|
717
908
|
[![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
|
718
|
-
|
909
|
+
|
910
|
+
[![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov]
|
719
911
|
|
720
912
|
### 🪇 Code of Conduct
|
721
913
|
|
722
|
-
Everyone interacting
|
723
|
-
chat rooms and mailing lists
|
914
|
+
Everyone interacting with this project's codebases, issue trackers,
|
915
|
+
chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
|
724
916
|
|
725
917
|
## 🌈 Contributors
|
726
918
|
|
@@ -728,18 +920,21 @@ chat rooms and mailing lists is expected to follow the [![Contributor Covenant 2
|
|
728
920
|
|
729
921
|
Made with [contributors-img][🖐contrib-rocks].
|
730
922
|
|
731
|
-
Also see GitLab Contributors: [https://gitlab.com/oauth
|
923
|
+
Also see GitLab Contributors: [https://gitlab.com/ruby-oauth/oauth2/-/graphs/main][🚎contributors-gl]
|
732
924
|
|
733
|
-
|
925
|
+
<details>
|
926
|
+
<summary>⭐️ Star History</summary>
|
734
927
|
|
735
|
-
<a href="https://star-history.com/#oauth
|
928
|
+
<a href="https://star-history.com/#ruby-oauth/oauth2&Date">
|
736
929
|
<picture>
|
737
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=oauth
|
738
|
-
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=oauth
|
739
|
-
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=oauth
|
930
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/oauth2&type=Date&theme=dark" />
|
931
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/oauth2&type=Date" />
|
932
|
+
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=ruby-oauth/oauth2&type=Date" />
|
740
933
|
</picture>
|
741
934
|
</a>
|
742
935
|
|
936
|
+
</details>
|
937
|
+
|
743
938
|
## 📌 Versioning
|
744
939
|
|
745
940
|
This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
|
@@ -748,34 +943,35 @@ Specifically, if a minor or patch version is released that breaks backward compa
|
|
748
943
|
a new version should be immediately released that restores compatibility.
|
749
944
|
Breaking changes to the public API will only be introduced with new major versions.
|
750
945
|
|
751
|
-
|
946
|
+
> dropping support for a platform is both obviously and objectively a breaking change <br/>
|
947
|
+
>—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
|
752
948
|
|
753
|
-
|
949
|
+
I understand that policy doesn't work universally ("exceptions to every rule!"),
|
950
|
+
but it is the policy here.
|
951
|
+
As such, in many cases it is good to specify a dependency on this library using
|
952
|
+
the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
|
754
953
|
|
755
|
-
|
756
|
-
|
757
|
-
|
954
|
+
For example:
|
955
|
+
|
956
|
+
```ruby
|
957
|
+
spec.add_dependency("oauth2", "~> 2.0")
|
958
|
+
```
|
758
959
|
|
759
|
-
>
|
960
|
+
<details>
|
961
|
+
<summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
|
760
962
|
|
761
|
-
|
963
|
+
SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
|
964
|
+
is a *breaking change* to an API.
|
965
|
+
It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
|
762
966
|
|
763
967
|
To get a better understanding of how SemVer is intended to work over a project's lifetime,
|
764
968
|
read this article from the creator of SemVer:
|
765
969
|
|
766
970
|
- ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
|
767
971
|
|
768
|
-
|
769
|
-
you can (and should) specify a dependency on these libraries using
|
770
|
-
the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
|
771
|
-
|
772
|
-
For example:
|
773
|
-
|
774
|
-
```ruby
|
775
|
-
spec.add_dependency("oauth2", "~> 2.0")
|
776
|
-
```
|
972
|
+
</details>
|
777
973
|
|
778
|
-
See [CHANGELOG.md][📌changelog] for list of releases.
|
974
|
+
See [CHANGELOG.md][📌changelog] for a list of releases.
|
779
975
|
|
780
976
|
## 📄 License
|
781
977
|
|
@@ -787,45 +983,91 @@ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright
|
|
787
983
|
|
788
984
|
<ul>
|
789
985
|
<li>
|
790
|
-
|
986
|
+
Copyright (c) 2017–2025 Peter H. Boling, of
|
791
987
|
<a href="https://discord.gg/3qme4XHNKN">
|
792
988
|
Galtzo.com
|
793
989
|
<picture>
|
794
|
-
<img src="https://
|
990
|
+
<img src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px-blank.svg" alt="Galtzo.com Logo (Wordless) by Aboling0, CC BY-SA 4.0" width="24">
|
795
991
|
</picture>
|
796
|
-
</a>, and oauth2 contributors
|
992
|
+
</a>, and oauth2 contributors.
|
797
993
|
</li>
|
798
994
|
<li>
|
799
|
-
Copyright (c) 2011
|
995
|
+
Copyright (c) 2011-2013 Michael Bleigh and Intridea, Inc.
|
800
996
|
</li>
|
801
997
|
</ul>
|
802
998
|
|
803
|
-
## 🤑
|
999
|
+
## 🤑 A request for help
|
1000
|
+
|
1001
|
+
Maintainers have teeth and need to pay their dentists.
|
1002
|
+
After getting laid off in an RIF in March and filled with many dozens of rejections,
|
1003
|
+
I'm now spending ~60+ hours a week building open source tools.
|
1004
|
+
I'm hoping to be able to pay for my kids' health insurance this month,
|
1005
|
+
so if you value the work I am doing, I need your support.
|
1006
|
+
Please consider sponsoring me or the project.
|
1007
|
+
|
1008
|
+
To join the community or get help 👇️ Join the Discord.
|
1009
|
+
|
1010
|
+
[![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
|
804
1011
|
|
805
|
-
|
806
|
-
so perhaps you'll indulge me for another 20 seconds.
|
807
|
-
I maintain many dozens of gems, including this one,
|
808
|
-
because I want Ruby to be a great place for people to solve problems, big and small.
|
809
|
-
Please consider supporting my efforts via the giant yellow link below,
|
810
|
-
or one of the others at the head of this README.
|
1012
|
+
To say "thanks for maintaining such a great tool" ☝️ Join the Discord or 👇️ send money.
|
811
1013
|
|
812
|
-
[![
|
1014
|
+
[![Sponsor ruby-oauth/oauth2 on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
|
1015
|
+
|
1016
|
+
### Please give the project a star ⭐ ♥.
|
1017
|
+
|
1018
|
+
Thanks for RTFM. ☺️
|
1019
|
+
|
1020
|
+
[⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
|
1021
|
+
[⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
|
1022
|
+
[⛳liberapay]: https://liberapay.com/pboling/donate
|
1023
|
+
[🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth
|
1024
|
+
[🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth
|
1025
|
+
[🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth
|
1026
|
+
[🖇osc-backers]: https://opencollective.com/ruby-oauth#backer
|
1027
|
+
[🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat
|
1028
|
+
[🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor
|
1029
|
+
[🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat
|
1030
|
+
[🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge
|
1031
|
+
[🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge
|
1032
|
+
[🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge
|
1033
|
+
[🖇osc]: https://opencollective.com/ruby-oauth
|
1034
|
+
[🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
|
1035
|
+
[🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
|
1036
|
+
[🖇sponsor]: https://github.com/sponsors/pboling
|
1037
|
+
[🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
|
1038
|
+
[🖇polar]: https://polar.sh/pboling
|
1039
|
+
[🖇kofi-img]: https://img.shields.io/badge/ko--fi-✓-a51611.svg?style=flat
|
1040
|
+
[🖇kofi]: https://ko-fi.com/O5O86SNP4
|
1041
|
+
[🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
|
1042
|
+
[🖇patreon]: https://patreon.com/galtzo
|
1043
|
+
[🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-✓-a51611.svg?style=flat
|
1044
|
+
[🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
|
1045
|
+
[🖇buyme]: https://www.buymeacoffee.com/pboling
|
1046
|
+
[🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
|
1047
|
+
[🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
|
1048
|
+
[🖇paypal]: https://www.paypal.com/paypalme/peterboling
|
1049
|
+
[🖇floss-funding.dev]: https://floss-funding.dev
|
1050
|
+
[🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
|
1051
|
+
[✉️discord-invite]: https://discord.gg/3qme4XHNKN
|
1052
|
+
[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
|
813
1053
|
|
814
1054
|
[⛳gg-discussions]: https://groups.google.com/g/oauth-ruby
|
815
1055
|
[⛳gg-discussions-img]: https://img.shields.io/badge/google-group-0093D0.svg?style=for-the-badge&logo=google&logoColor=orange
|
816
1056
|
|
817
1057
|
[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
|
818
|
-
[⛳️gem-namespace]: https://github.com/oauth
|
819
|
-
[⛳️namespace-img]: https://img.shields.io/badge/namespace-OAuth2-
|
1058
|
+
[⛳️gem-namespace]: https://github.com/ruby-oauth/oauth2
|
1059
|
+
[⛳️namespace-img]: https://img.shields.io/badge/namespace-OAuth2-3C2D2D.svg?style=square&logo=ruby&logoColor=white
|
820
1060
|
[⛳️gem-name]: https://rubygems.org/gems/oauth2
|
821
|
-
[⛳️name-img]: https://img.shields.io/badge/name-oauth2-
|
822
|
-
[
|
823
|
-
[
|
824
|
-
[🚂
|
825
|
-
[🚂
|
1061
|
+
[⛳️name-img]: https://img.shields.io/badge/name-oauth2-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
|
1062
|
+
[⛳️tag-img]: https://img.shields.io/github/tag/ruby-oauth/oauth2.svg
|
1063
|
+
[⛳️tag]: http://github.com/ruby-oauth/oauth2/releases
|
1064
|
+
[🚂maint-blog]: http://www.railsbling.com/tags/oauth2
|
1065
|
+
[🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
|
1066
|
+
[🚂maint-contact]: http://www.railsbling.com/contact
|
1067
|
+
[🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
|
826
1068
|
[💖🖇linkedin]: http://www.linkedin.com/in/peterboling
|
827
1069
|
[💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
|
828
|
-
[💖✌️wellfound]: https://
|
1070
|
+
[💖✌️wellfound]: https://wellfound.com/u/peter-boling/u/peter-boling
|
829
1071
|
[💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
|
830
1072
|
[💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
|
831
1073
|
[💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
|
@@ -847,78 +1089,68 @@ or one of the others at the head of this README.
|
|
847
1089
|
[👨🏼🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
|
848
1090
|
[👨🏼🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
|
849
1091
|
[👨🏼🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
|
850
|
-
[🏙️entsup-tidelift]: https://tidelift.com/subscription
|
1092
|
+
[🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-oauth2?utm_source=rubygems-oauth2&utm_medium=referral&utm_campaign=readme
|
851
1093
|
[🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
|
852
1094
|
[🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
|
853
1095
|
[💁🏼♂️peterboling]: http://www.peterboling.com
|
854
1096
|
[🚂railsbling]: http://www.railsbling.com
|
855
1097
|
[📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
|
856
|
-
[📜src-gl]: https://gitlab.com/oauth
|
1098
|
+
[📜src-gl]: https://gitlab.com/ruby-oauth/oauth2/
|
857
1099
|
[📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
|
858
|
-
[📜src-cb]: https://codeberg.org/oauth
|
1100
|
+
[📜src-cb]: https://codeberg.org/ruby-oauth/oauth2
|
859
1101
|
[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
|
860
|
-
[📜src-gh]: https://github.com/oauth
|
1102
|
+
[📜src-gh]: https://github.com/ruby-oauth/oauth2
|
861
1103
|
[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
|
862
1104
|
[📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
|
863
|
-
[📜wiki]: https://gitlab.com/oauth
|
1105
|
+
[📜wiki]: https://gitlab.com/ruby-oauth/oauth2/-/wikis/home
|
864
1106
|
[📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=Wiki&logoColor=white
|
865
1107
|
[👽dl-rank]: https://rubygems.org/gems/oauth2
|
866
1108
|
[👽dl-ranki]: https://img.shields.io/gem/rd/oauth2.svg
|
867
|
-
[👽oss-help]: https://www.codetriage.com/oauth
|
868
|
-
[👽oss-helpi]: https://www.codetriage.com/oauth
|
1109
|
+
[👽oss-help]: https://www.codetriage.com/ruby-oauth/oauth2
|
1110
|
+
[👽oss-helpi]: https://www.codetriage.com/ruby-oauth/oauth2/badges/users.svg
|
869
1111
|
[👽version]: https://rubygems.org/gems/oauth2
|
870
1112
|
[👽versioni]: https://img.shields.io/gem/v/oauth2.svg
|
871
|
-
[🔑qlty-mnt]: https://qlty.sh/gh/oauth
|
872
|
-
[🔑qlty-mnti
|
873
|
-
[🔑qlty-cov]: https://qlty.sh/gh/oauth
|
874
|
-
[🔑qlty-covi
|
875
|
-
[🔑codecov]: https://codecov.io/gh/oauth
|
876
|
-
[🔑codecovi
|
877
|
-
[🔑coveralls]: https://coveralls.io/github/oauth
|
878
|
-
[🔑coveralls-img]: https://coveralls.io/repos/github/oauth
|
879
|
-
[
|
880
|
-
[
|
881
|
-
[
|
882
|
-
[
|
883
|
-
[🚎
|
884
|
-
[🚎
|
885
|
-
[🚎
|
886
|
-
[🚎
|
887
|
-
[🚎
|
888
|
-
[🚎
|
889
|
-
[🚎
|
890
|
-
[🚎
|
891
|
-
[🚎
|
892
|
-
[🚎
|
893
|
-
[🚎
|
894
|
-
[🚎
|
895
|
-
[🚎
|
896
|
-
[🚎
|
897
|
-
[🚎
|
898
|
-
[🚎
|
899
|
-
[🚎
|
900
|
-
[🚎
|
901
|
-
[🚎
|
902
|
-
[🚎
|
903
|
-
[🚎
|
904
|
-
[🚎
|
905
|
-
[🚎
|
906
|
-
[🚎
|
907
|
-
[🚎13
|
908
|
-
[🚎13
|
909
|
-
[
|
910
|
-
[
|
911
|
-
[
|
912
|
-
[🖇sponsor]: https://github.com/sponsors/pboling
|
913
|
-
[🖇polar-img]: https://img.shields.io/badge/polar-donate-yellow.svg
|
914
|
-
[🖇polar]: https://polar.sh/pboling
|
915
|
-
[🖇kofi-img]: https://img.shields.io/badge/a_more_different_coffee-✓-yellow.svg
|
916
|
-
[🖇kofi]: https://ko-fi.com/O5O86SNP4
|
917
|
-
[🖇patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg
|
918
|
-
[🖇patreon]: https://patreon.com/galtzo
|
919
|
-
[🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
|
920
|
-
[🖇buyme]: https://www.buymeacoffee.com/pboling
|
921
|
-
[🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-✓-yellow.svg?style=flat
|
1113
|
+
[🔑qlty-mnt]: https://qlty.sh/gh/ruby-oauth/projects/oauth2
|
1114
|
+
[🔑qlty-mnti]: https://qlty.sh/gh/ruby-oauth/projects/oauth2/maintainability.svg
|
1115
|
+
[🔑qlty-cov]: https://qlty.sh/gh/ruby-oauth/projects/oauth2/metrics/code?sort=coverageRating
|
1116
|
+
[🔑qlty-covi]: https://qlty.sh/gh/ruby-oauth/projects/oauth2/coverage.svg
|
1117
|
+
[🔑codecov]: https://codecov.io/gh/ruby-oauth/oauth2
|
1118
|
+
[🔑codecovi]: https://codecov.io/gh/ruby-oauth/oauth2/graph/badge.svg
|
1119
|
+
[🔑coveralls]: https://coveralls.io/github/ruby-oauth/oauth2?branch=main
|
1120
|
+
[🔑coveralls-img]: https://coveralls.io/repos/github/ruby-oauth/oauth2/badge.svg?branch=main
|
1121
|
+
[🖐codeQL]: https://github.com/ruby-oauth/oauth2/security/code-scanning
|
1122
|
+
[🖐codeQL-img]: https://github.com/ruby-oauth/oauth2/actions/workflows/codeql-analysis.yml/badge.svg
|
1123
|
+
[🚎1-an-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ancient.yml
|
1124
|
+
[🚎1-an-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/ancient.yml/badge.svg
|
1125
|
+
[🚎2-cov-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/coverage.yml
|
1126
|
+
[🚎2-cov-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/coverage.yml/badge.svg
|
1127
|
+
[🚎3-hd-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/heads.yml
|
1128
|
+
[🚎3-hd-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/heads.yml/badge.svg
|
1129
|
+
[🚎4-lg-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/legacy.yml
|
1130
|
+
[🚎4-lg-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/legacy.yml/badge.svg
|
1131
|
+
[🚎5-st-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/style.yml
|
1132
|
+
[🚎5-st-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/style.yml/badge.svg
|
1133
|
+
[🚎6-s-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/supported.yml
|
1134
|
+
[🚎6-s-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/supported.yml/badge.svg
|
1135
|
+
[🚎7-us-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/unsupported.yml
|
1136
|
+
[🚎7-us-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/unsupported.yml/badge.svg
|
1137
|
+
[🚎8-ho-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/hoary.yml
|
1138
|
+
[🚎8-ho-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/hoary.yml/badge.svg
|
1139
|
+
[🚎9-t-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffle.yml
|
1140
|
+
[🚎9-t-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffle.yml/badge.svg
|
1141
|
+
[🚎10-j-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby.yml
|
1142
|
+
[🚎10-j-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby.yml/badge.svg
|
1143
|
+
[🚎11-c-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/current.yml
|
1144
|
+
[🚎11-c-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/current.yml/badge.svg
|
1145
|
+
[🚎12-crh-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/current-runtime-heads.yml
|
1146
|
+
[🚎12-crh-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/current-runtime-heads.yml/badge.svg
|
1147
|
+
[🚎13-cbs-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/caboose.yml
|
1148
|
+
[🚎13-cbs-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/caboose.yml/badge.svg
|
1149
|
+
[🚎13-🔒️-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/locked_deps.yml
|
1150
|
+
[🚎13-🔒️-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/locked_deps.yml/badge.svg
|
1151
|
+
[🚎14-🔓️-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/unlocked_deps.yml
|
1152
|
+
[🚎14-🔓️-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/unlocked_deps.yml/badge.svg
|
1153
|
+
[💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
|
922
1154
|
[💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
|
923
1155
|
[💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
|
924
1156
|
[💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
|
@@ -930,30 +1162,30 @@ or one of the others at the head of this README.
|
|
930
1162
|
[💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
|
931
1163
|
[💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
|
932
1164
|
[💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
|
933
|
-
[💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.
|
934
|
-
[💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.
|
1165
|
+
[💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
|
1166
|
+
[💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
|
935
1167
|
[💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
|
936
1168
|
[💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
|
937
1169
|
[💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
|
938
|
-
[💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.
|
939
|
-
[💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.
|
940
|
-
[💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.
|
1170
|
+
[💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
|
1171
|
+
[💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
|
1172
|
+
[💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
|
941
1173
|
[💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
|
942
1174
|
[💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
|
943
1175
|
[💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
|
944
|
-
[🤝gh-issues]: https://github.com/oauth
|
945
|
-
[🤝gh-pulls]: https://github.com/oauth
|
946
|
-
[🤝gl-issues]: https://gitlab.com/oauth
|
947
|
-
[🤝gl-pulls]: https://gitlab.com/oauth
|
948
|
-
[🤝cb-issues]: https://codeberg.org/oauth
|
949
|
-
[🤝cb-pulls]: https://codeberg.org/oauth
|
1176
|
+
[🤝gh-issues]: https://github.com/ruby-oauth/oauth2/issues
|
1177
|
+
[🤝gh-pulls]: https://github.com/ruby-oauth/oauth2/pulls
|
1178
|
+
[🤝gl-issues]: https://gitlab.com/ruby-oauth/oauth2/-/issues
|
1179
|
+
[🤝gl-pulls]: https://gitlab.com/ruby-oauth/oauth2/-/merge_requests
|
1180
|
+
[🤝cb-issues]: https://codeberg.org/ruby-oauth/oauth2/issues
|
1181
|
+
[🤝cb-pulls]: https://codeberg.org/ruby-oauth/oauth2/pulls
|
950
1182
|
[🤝cb-donate]: https://donate.codeberg.org/
|
951
1183
|
[🤝contributing]: CONTRIBUTING.md
|
952
|
-
[🔑codecov-g
|
1184
|
+
[🔑codecov-g]: https://codecov.io/gh/ruby-oauth/oauth2/graphs/tree.svg
|
953
1185
|
[🖐contrib-rocks]: https://contrib.rocks
|
954
|
-
[🖐contributors]: https://github.com/oauth
|
955
|
-
[🖐contributors-img]: https://contrib.rocks/image?repo=oauth
|
956
|
-
[🚎contributors-gl]: https://gitlab.com/oauth
|
1186
|
+
[🖐contributors]: https://github.com/ruby-oauth/oauth2/graphs/contributors
|
1187
|
+
[🖐contributors-img]: https://contrib.rocks/image?repo=ruby-oauth/oauth2
|
1188
|
+
[🚎contributors-gl]: https://gitlab.com/ruby-oauth/oauth2/-/graphs/main
|
957
1189
|
[🪇conduct]: CODE_OF_CONDUCT.md
|
958
1190
|
[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
|
959
1191
|
[📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
|
@@ -967,7 +1199,7 @@ or one of the others at the head of this README.
|
|
967
1199
|
[📌gitmoji]:https://gitmoji.dev
|
968
1200
|
[📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20😜%20😍-34495e.svg?style=flat-square
|
969
1201
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
970
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.
|
1202
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.519-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
971
1203
|
[🔐security]: SECURITY.md
|
972
1204
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
973
1205
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
@@ -978,13 +1210,13 @@ or one of the others at the head of this README.
|
|
978
1210
|
[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
|
979
1211
|
[🚎yard-current]: http://rubydoc.info/gems/oauth2
|
980
1212
|
[🚎yard-head]: https://oauth2.galtzo.com
|
981
|
-
[💎stone_checksums]: https://github.com/
|
982
|
-
[💎SHA_checksums]: https://gitlab.com/oauth
|
1213
|
+
[💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
|
1214
|
+
[💎SHA_checksums]: https://gitlab.com/ruby-oauth/oauth2/-/tree/main/checksums
|
983
1215
|
[💎rlts]: https://github.com/rubocop-lts/rubocop-lts
|
984
1216
|
[💎rlts-img]: https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
|
1217
|
+
[💎appraisal2]: https://github.com/appraisal-rb/appraisal2
|
1218
|
+
[💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
|
985
1219
|
[💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
|
986
|
-
[✉️discord-invite]: https://discord.gg/3qme4XHNKN
|
987
|
-
[✉️discord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
|
988
1220
|
|
989
1221
|
<details>
|
990
1222
|
<summary>
|
@@ -993,4 +1225,14 @@ or one of the others at the head of this README.
|
|
993
1225
|
|
994
1226
|
<a rel="me" alt="Follow me on Ruby.social" href="https://ruby.social/@galtzo"><img src="https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=social&label=Follow%20%40galtzo%20on%20Ruby.social"></a>
|
995
1227
|
<a rel="me" alt="Follow me on FLOSS.social" href="https://floss.social/@galtzo"><img src="https://img.shields.io/mastodon/follow/110304921404405715?domain=https%3A%2F%2Ffloss.social&style=social&label=Follow%20%40galtzo%20on%20Floss.social"></a>
|
1228
|
+
|
1229
|
+
</details>
|
1230
|
+
|
1231
|
+
|
1232
|
+
<details>
|
1233
|
+
<summary>Broken badges</summary>
|
1234
|
+
|
1235
|
+
[![Coverage Graph][🔑codecov-g]][🔑codecov]
|
1236
|
+
[![CodeCov Test Coverage][🔑codecovi]][🔑codecov]
|
1237
|
+
|
996
1238
|
</details>
|