warden_oauth 0.1.0 → 0.1.2

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.
data/README.md ADDED
@@ -0,0 +1,574 @@
1
+ <a href="https://github.com/ruby-oauth"><img alt="ruby-oauth Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/ruby-oauth/avatar-128px.svg" width="14%" align="right"/></a>
2
+
3
+ # 🛡️ Warden::OAuth
4
+
5
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![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 Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
6
+
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
8
+
9
+ ---
10
+
11
+ `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.
12
+
13
+ [![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 at ko-fi.com][🖇kofi-img]][🖇kofi]
14
+
15
+ <details>
16
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
17
+
18
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
19
+
20
+ </details>
21
+
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
23
+
24
+ `warden_oauth` adds OAuth authentication strategy helpers to the Warden authentication framework.
25
+ It lets a Rack application declare named OAuth services on `Warden::Manager`, then route requests through the generated Warden strategy for that service.
26
+
27
+ ## 💡 Info you can shake a stick at
28
+
29
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
30
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
31
+ | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎jruby-9.2-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎jruby-9.3-wf] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎jruby-9.4-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
32
+ | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎truby-22.3-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎truby-23.0-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎truby-23.1-wf] <br/> [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf]|
33
+ | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-4.0i]][🚎11-c-wf] [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
34
+ | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎ruby-3.0-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎ruby-3.1-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
35
+ | Works with MRI Ruby 2 | ![Ruby 2.0 Compat][💎ruby-2.0i] ![Ruby 2.1 Compat][💎ruby-2.1i] ![Ruby 2.2 Compat][💎ruby-2.2i] ![Ruby 2.3 Compat][💎ruby-2.3i] <br/> [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎ruby-2.4-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎ruby-2.5-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎ruby-2.6-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎ruby-2.7-wf]|
36
+ | Works with MRI Ruby 1 | ![Ruby 1.8 Compat][💎ruby-1.8i] ![Ruby 1.9 Compat][💎ruby-1.9i]|
37
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![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] |
38
+ | 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] |
39
+ | 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] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
40
+ | Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
41
+ | 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] |
42
+ | 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] |
43
+ | `...` 💖 | [![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] |
44
+
45
+ ### Compatibility
46
+
47
+ Compatible with MRI Ruby 1.8+, and concordant releases of JRuby, and TruffleRuby.
48
+ CI workflows and Appraisals are generated for MRI Ruby 2.4+.
49
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
50
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
51
+ not practical for the current toolchain.
52
+
53
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
54
+ |------------------------------------------------|--------------------------------------------------------|
55
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
56
+
57
+ ### Federated DVCS
58
+
59
+ <details markdown="1">
60
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
61
+
62
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
63
+ |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
64
+ | 🧪 [ruby-oauth/warden_oauth on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
65
+ | 🧊 [ruby-oauth/warden_oauth on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
66
+ | 🐙 [ruby-oauth/warden_oauth on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
67
+ | 🎮️ [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] |
68
+
69
+ </details>
70
+
71
+ [gh-discussions]: https://github.com/ruby-oauth/warden_oauth/discussions
72
+
73
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/warden_oauth)](https://tidelift.com/subscription/pkg/rubygems-warden_oauth?utm_source=rubygems-warden_oauth&utm_medium=referral&utm_campaign=readme)
74
+
75
+ Available as part of the Tidelift Subscription.
76
+
77
+ <details markdown="1">
78
+ <summary>Need enterprise-level guarantees?</summary>
79
+
80
+ The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
81
+
82
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
83
+
84
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
85
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
86
+ - 💡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
87
+
88
+ Alternatively:
89
+
90
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
91
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
92
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
93
+
94
+ </details>
95
+
96
+ ## ✨ Installation
97
+
98
+ Install the gem and add to the application's Gemfile by executing:
99
+
100
+ ```console
101
+ bundle add warden_oauth
102
+ ```
103
+
104
+ If bundler is not being used to manage dependencies, install the gem by executing:
105
+
106
+ ```console
107
+ gem install warden_oauth
108
+ ```
109
+
110
+ ## ⚙️ Configuration
111
+
112
+ Require `warden_oauth`, then configure each OAuth service inside the `Warden::Manager` middleware declaration:
113
+
114
+ ```ruby
115
+ use Warden::Manager do |config|
116
+ config.failure_app = FailureApp
117
+
118
+ config.oauth(:twitter) do |twitter|
119
+ twitter.consumer_secret "YOUR CONSUMER SECRET"
120
+ twitter.consumer_key "YOUR CONSUMER KEY"
121
+ twitter.options :site => "http://twitter.com"
122
+ end
123
+
124
+ config.default_strategies(:twitter_oauth, :password, :other)
125
+ end
126
+ ```
127
+
128
+ Each `config.oauth(:service_name)` declaration creates a strategy class named `Warden::OAuth::Strategy::ServiceName` and registers it with Warden as `:service_name_oauth`.
129
+ For example, `config.oauth(:twitter)` creates `Warden::OAuth::Strategy::Twitter` and registers `:twitter_oauth`.
130
+
131
+ Applications still running on Ruby 2.4 or Ruby 2.5 must use the old-Ruby `rack-session` fork, because released `rack-session` versions that otherwise resolve for those Rubies can fail while loading `rack/session/cookie`:
132
+
133
+ ```ruby
134
+ gem "rack-session", "< 2", :github => "pboling/rack-session", :branch => "fix-missing-rack-session"
135
+ ```
136
+
137
+ ## 🔧 Basic Usage
138
+
139
+ Users are identified by the OAuth access token returned by the provider.
140
+ Register an access-token user finder for each OAuth service:
141
+
142
+ ```ruby
143
+ Warden::OAuth.access_token_user_finder(:twitter) do |access_token|
144
+ User.find_by_access_token_and_access_secret(access_token.token, access_token.secret)
145
+ end
146
+ ```
147
+
148
+ If the finder returns a user, that user is authenticated into the session.
149
+ If it returns `nil`, Warden calls the configured failure app and exposes the original access token at:
150
+
151
+ ```ruby
152
+ env["warden.options"][:oauth][:access_token]
153
+ ```
154
+
155
+ To start an OAuth flow, send the protected request with a `warden_oauth_provider` parameter matching the configured service name:
156
+
157
+ ```ruby
158
+ link_to "Twitter Authentication", url_for(login_path(:warden_oauth_provider => "twitter"))
159
+ ```
160
+
161
+ The strategy has three outcomes:
162
+
163
+ 1. The OAuth credentials are invalid, and the failure app is called.
164
+ 2. The OAuth credentials are valid, but no local user is associated with them; the failure app is called with `env["warden.options"][:oauth][:access_token]` available.
165
+ 3. The OAuth credentials are valid, and the returned user is authenticated successfully.
166
+
167
+ In Rails, do not define `:warden_oauth_provider` as part of the login route itself.
168
+ If Rails consumes that parameter before the request reaches the Warden Rack middleware, the OAuth strategy will not run.
169
+
170
+ ## 🦷 FLOSS Funding
171
+
172
+ While ruby-oauth tools are free software and will always be, the project would benefit immensely from some funding.
173
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
174
+
175
+ We welcome both individual and corporate sponsors! We also offer a
176
+ wide array of funding channels to account for your preferences.
177
+ Currently, [Open Collective][🖇osc] is our preferred funding platform.
178
+
179
+ **If you're working in a company that's making significant use of ruby-oauth tools we'd
180
+ appreciate it if you suggest to your company to become a ruby-oauth sponsor.**
181
+
182
+ You can support the development of ruby-oauth tools via
183
+ [GitHub Sponsors][🖇sponsor],
184
+ [Liberapay][⛳liberapay],
185
+ [PayPal][🖇paypal],
186
+ [Open Collective][🖇osc]
187
+ and [Tidelift][🏙️entsup-tidelift].
188
+
189
+ | 📍 NOTE |
190
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
191
+ | 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. |
192
+
193
+ ### Open Collective for Individuals
194
+
195
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/ruby-oauth#backer)]
196
+
197
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
198
+
199
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
200
+ No backers yet. Be the first!
201
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
202
+
203
+ ### Open Collective for Organizations
204
+
205
+ 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)]
206
+
207
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
208
+
209
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
210
+ No sponsors yet. Be the first!
211
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
212
+
213
+ [kettle-readme-backers]: https://github.com/ruby-oauth/warden_oauth/blob/main/exe/kettle-readme-backers
214
+
215
+ ### Another way to support open-source
216
+
217
+ 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. 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).
218
+
219
+ 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`.
220
+
221
+ 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.
222
+
223
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
224
+
225
+ [![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 efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
226
+
227
+ ## 🔐 Security
228
+
229
+ See [SECURITY.md][🔐security].
230
+
231
+ ## 🤝 Contributing
232
+
233
+ If you need some ideas of where to help, you could work on adding more code coverage,
234
+ or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
235
+ or use the gem and think about how it could be better.
236
+
237
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
238
+
239
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
240
+
241
+ ### 🚀 Release Instructions
242
+
243
+ See [CONTRIBUTING.md][🤝contributing].
244
+
245
+ ### Code Coverage
246
+
247
+ <details markdown="1">
248
+ <summary>Coverage service badges</summary>
249
+
250
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
251
+
252
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
253
+
254
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
255
+
256
+ </details>
257
+
258
+ ### 🪇 Code of Conduct
259
+
260
+ Everyone interacting with this project's codebases, issue trackers,
261
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
262
+
263
+ ## 🌈 Contributors
264
+
265
+ [![Contributors][🖐contributors-img]][🖐contributors]
266
+
267
+ Made with [contributors-img][🖐contrib-rocks].
268
+
269
+ Also see GitLab Contributors: [https://gitlab.com/ruby-oauth/warden_oauth/-/graphs/main][🚎contributors-gl]
270
+
271
+ <details>
272
+ <summary>⭐️ Star History</summary>
273
+
274
+ <a href="https://star-history.com/ruby-oauth/warden_oauth&Date">
275
+ <picture>
276
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/warden_oauth&type=Date&theme=dark" />
277
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/warden_oauth&type=Date" />
278
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=ruby-oauth/warden_oauth&type=Date" />
279
+ </picture>
280
+ </a>
281
+
282
+ </details>
283
+
284
+ ## 📌 Versioning
285
+
286
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
287
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
288
+
289
+ For example:
290
+
291
+ ```ruby
292
+ spec.add_dependency("warden_oauth", "~> 0.0")
293
+ ```
294
+
295
+ <details markdown="1">
296
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
297
+
298
+ Dropping support for a platform can be a breaking change for affected users.
299
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
300
+
301
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
302
+ read this article from the creator of SemVer:
303
+
304
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
305
+
306
+ </details>
307
+
308
+ See [CHANGELOG.md][📌changelog] for a list of releases.
309
+
310
+ ## 📄 License
311
+
312
+ The gem is available as open source under the terms of
313
+ the [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].
314
+
315
+ ### © Copyright
316
+
317
+ See [LICENSE.md][📄license] for the official copyright notice.
318
+
319
+ <details markdown="1">
320
+ <summary>Copyright holders</summary>
321
+
322
+ - Copyright (c) 2009-2010 Roman Gonzalez
323
+ - Copyright (c) 2010 Eoin Hennessy
324
+ - Copyright (c) 2025-2026 Peter H. Boling
325
+
326
+ </details>
327
+
328
+ ## 🤑 A request for help
329
+
330
+ Maintainers have teeth and need to pay their dentists.
331
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
332
+ I began spending most of my time building open source tools.
333
+ I'm hoping to be able to pay for my kids' health insurance this month,
334
+ so if you value the work I am doing, I need your support.
335
+ Please consider sponsoring me or the project.
336
+
337
+ To join the community or get help 👇️ Join the Discord.
338
+
339
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
340
+
341
+ To say "thanks!" ☝️ Join the Discord or 👇️ send money.
342
+
343
+ [![Sponsor ruby-oauth/warden_oauth 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] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
344
+
345
+ ### Please give the project a star ⭐ ♥.
346
+
347
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
348
+
349
+ Thanks for RTFM. ☺️
350
+
351
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
352
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
353
+ [⛳liberapay]: https://liberapay.com/pboling/donate
354
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth
355
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth
356
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth
357
+ [🖇osc-backers]: https://opencollective.com/ruby-oauth#backer
358
+ [🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat
359
+ [🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor
360
+ [🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat
361
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge
362
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge
363
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge
364
+ [🖇osc]: https://opencollective.com/ruby-oauth
365
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
366
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
367
+ [🖇sponsor]: https://github.com/sponsors/pboling
368
+ [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
369
+ [🖇polar]: https://polar.sh/pboling
370
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
371
+ [🖇kofi]: https://ko-fi.com/pboling
372
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
373
+ [🖇patreon]: https://patreon.com/galtzo
374
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
375
+ [🖇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
376
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
377
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
378
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
379
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
380
+ [🖇floss-funding.dev]: https://floss-funding.dev
381
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
382
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
383
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
384
+ [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
385
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
386
+
387
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
388
+ [⛳️gem-namespace]: https://github.com/ruby-oauth/warden_oauth
389
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Warden::OAuth-3C2D2D.svg?style=square&logo=ruby&logoColor=white
390
+ [⛳️gem-name]: https://bestgems.org/gems/warden_oauth
391
+ [⛳️name-img]: https://img.shields.io/badge/name-warden__oauth-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
392
+ [⛳️tag-img]: https://img.shields.io/github/tag/ruby-oauth/warden_oauth.svg
393
+ [⛳️tag]: https://github.com/ruby-oauth/warden_oauth/releases
394
+ [🚂maint-blog]: http://www.railsbling.com/tags/warden_oauth
395
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
396
+ [🚂maint-contact]: http://www.railsbling.com/contact
397
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
398
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
399
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
400
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
401
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
402
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
403
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
404
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
405
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
406
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
407
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
408
+ [💖🌳linktree]: https://linktr.ee/galtzo
409
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
410
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
411
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
412
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
413
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
414
+ [💖🧊berg]: https://codeberg.org/pboling
415
+ [💖🐙hub]: https://github.org/pboling
416
+ [💖🛖hut]: https://sr.ht/~galtzo/
417
+ [💖🧪lab]: https://gitlab.com/pboling
418
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
419
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
420
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
421
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
422
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-warden_oauth?utm_source=rubygems-warden_oauth&utm_medium=referral&utm_campaign=readme
423
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
424
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
425
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
426
+ [🚂railsbling]: http://www.railsbling.com
427
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
428
+ [📜src-gl]: https://gitlab.com/ruby-oauth/warden_oauth
429
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
430
+ [📜src-cb]: https://codeberg.org/ruby-oauth/warden_oauth
431
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
432
+ [📜src-gh]: https://github.com/ruby-oauth/warden_oauth
433
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
434
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
435
+ [📜gl-wiki]: https://gitlab.com/ruby-oauth/warden_oauth/-/wikis/home
436
+ [📜gh-wiki]: https://github.com/ruby-oauth/warden_oauth/wiki
437
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
438
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
439
+ [👽dl-rank]: https://bestgems.org/gems/warden_oauth
440
+ [👽dl-ranki]: https://img.shields.io/gem/rd/warden_oauth.svg
441
+ [👽version]: https://bestgems.org/gems/warden_oauth
442
+ [👽versioni]: https://img.shields.io/gem/v/warden_oauth.svg
443
+ [🏀qlty-mnt]: https://qlty.sh/gh/ruby-oauth/projects/warden_oauth
444
+ [🏀qlty-mnti]: https://qlty.sh/gh/ruby-oauth/projects/warden_oauth/maintainability.svg
445
+ [🏀qlty-cov]: https://qlty.sh/gh/ruby-oauth/projects/warden_oauth/metrics/code?sort=coverageRating
446
+ [🏀qlty-covi]: https://qlty.sh/gh/ruby-oauth/projects/warden_oauth/coverage.svg
447
+ [🏀codecov]: https://codecov.io/gh/ruby-oauth/warden_oauth
448
+ [🏀codecovi]: https://codecov.io/gh/ruby-oauth/warden_oauth/graph/badge.svg
449
+ [🏀coveralls]: https://coveralls.io/github/ruby-oauth/warden_oauth?branch=main
450
+ [🏀coveralls-img]: https://coveralls.io/repos/github/ruby-oauth/warden_oauth/badge.svg?branch=main
451
+ [🚎ruby-2.4-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-2.4.yml
452
+ [🚎ruby-2.5-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-2.5.yml
453
+ [🚎ruby-2.6-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-2.6.yml
454
+ [🚎ruby-2.7-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-2.7.yml
455
+ [🚎ruby-3.0-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-3.0.yml
456
+ [🚎ruby-3.1-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-3.1.yml
457
+ [🚎ruby-3.2-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-3.2.yml
458
+ [🚎ruby-3.3-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-3.3.yml
459
+ [🚎ruby-3.4-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/ruby-3.4.yml
460
+ [🚎jruby-9.2-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/jruby-9.2.yml
461
+ [🚎jruby-9.3-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/jruby-9.3.yml
462
+ [🚎jruby-9.4-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/jruby-9.4.yml
463
+ [🚎truby-22.3-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/truffleruby-22.3.yml
464
+ [🚎truby-23.0-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/truffleruby-23.0.yml
465
+ [🚎truby-23.1-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/truffleruby-23.1.yml
466
+ [🚎truby-24.2-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/truffleruby-24.2.yml
467
+ [🚎truby-25.0-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/truffleruby-25.0.yml
468
+ [🚎2-cov-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/coverage.yml
469
+ [🚎2-cov-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/coverage.yml/badge.svg
470
+ [🚎3-hd-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/heads.yml
471
+ [🚎3-hd-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/heads.yml/badge.svg
472
+ [🚎5-st-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/style.yml
473
+ [🚎5-st-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/style.yml/badge.svg
474
+ [🚎9-t-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/truffle.yml
475
+ [🚎9-t-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/truffle.yml/badge.svg
476
+ [🚎10-j-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/jruby.yml
477
+ [🚎10-j-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/jruby.yml/badge.svg
478
+ [🚎11-c-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/current.yml
479
+ [🚎11-c-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/current.yml/badge.svg
480
+ [🚎12-crh-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/dep-heads.yml
481
+ [🚎12-crh-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/dep-heads.yml/badge.svg
482
+ [🚎13-🔒️-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/locked_deps.yml
483
+ [🚎13-🔒️-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/locked_deps.yml/badge.svg
484
+ [🚎14-🔓️-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/unlocked_deps.yml
485
+ [🚎14-🔓️-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/unlocked_deps.yml/badge.svg
486
+ [🚎15-🪪-wf]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/license-eye.yml
487
+ [🚎15-🪪-wfi]: https://github.com/ruby-oauth/warden_oauth/actions/workflows/license-eye.yml/badge.svg
488
+ [💎ruby-1.8i]: https://img.shields.io/badge/Ruby-1.8_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
489
+ [💎ruby-1.9i]: https://img.shields.io/badge/Ruby-1.9_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
490
+ [💎ruby-2.0i]: https://img.shields.io/badge/Ruby-2.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
491
+ [💎ruby-2.1i]: https://img.shields.io/badge/Ruby-2.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
492
+ [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
493
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
494
+ [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
495
+ [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
496
+ [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
497
+ [💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
498
+ [💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
499
+ [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
500
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
501
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
502
+ [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
503
+ [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
504
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
505
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
506
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
507
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
508
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
509
+ [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
510
+ [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
511
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
512
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
513
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
514
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
515
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
516
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
517
+ [🤝gh-issues]: https://github.com/ruby-oauth/warden_oauth/issues
518
+ [🤝gh-pulls]: https://github.com/ruby-oauth/warden_oauth/pulls
519
+ [🤝gl-issues]: https://gitlab.com/ruby-oauth/warden_oauth/-/issues
520
+ [🤝gl-pulls]: https://gitlab.com/ruby-oauth/warden_oauth/-/merge_requests
521
+ [🤝cb-issues]: https://codeberg.org/ruby-oauth/warden_oauth/issues
522
+ [🤝cb-pulls]: https://codeberg.org/ruby-oauth/warden_oauth/pulls
523
+ [🤝cb-donate]: https://donate.codeberg.org/
524
+ [🤝contributing]: https://github.com/ruby-oauth/warden_oauth/blob/main/CONTRIBUTING.md
525
+ [🏀codecov-g]: https://codecov.io/gh/ruby-oauth/warden_oauth/graph/badge.svg
526
+ [🖐contrib-rocks]: https://contrib.rocks
527
+ [🖐contributors]: https://github.com/ruby-oauth/warden_oauth/graphs/contributors
528
+ [🖐contributors-img]: https://contrib.rocks/image?repo=ruby-oauth/warden_oauth
529
+ [🚎contributors-gl]: https://gitlab.com/ruby-oauth/warden_oauth/-/graphs/main
530
+ [🪇conduct]: https://github.com/ruby-oauth/warden_oauth/blob/main/CODE_OF_CONDUCT.md
531
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
532
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
533
+ [📌semver]: https://semver.org/spec/v2.0.0.html
534
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
535
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
536
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
537
+ [📌changelog]: https://github.com/ruby-oauth/warden_oauth/blob/main/CHANGELOG.md
538
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
539
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
540
+ [📌gitmoji]: https://gitmoji.dev
541
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
542
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
543
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.158-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
544
+ [🔐security]: https://github.com/ruby-oauth/warden_oauth/blob/main/SECURITY.md
545
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
546
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
547
+ [📄license]: LICENSE.md
548
+ [📄license-ref]: MIT.md
549
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
550
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
551
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
552
+
553
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
554
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
555
+ [🚎yard-current]: http://rubydoc.info/gems/warden_oauth
556
+ [🚎yard-head]: https://warden-oauth.galtzo.com
557
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
558
+ [💎SHA_checksums]: https://gitlab.com/ruby-oauth/warden_oauth/-/tree/main/checksums
559
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
560
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
561
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
562
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
563
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
564
+
565
+ <!-- kettle-jem:metadata:start -->
566
+ | Field | Value |
567
+ |---|---|
568
+ | Package | warden_oauth |
569
+ | Description | 🛡️ warden_oauth will help you create oauth authentication strategies using the oauth<br>helper method on the Warden::Manager config setup |
570
+ | Homepage | https://github.com/ruby-oauth/warden_oauth |
571
+ | Source | https://github.com/ruby-oauth/warden_oauth/tree/v0.1.1 |
572
+ | License | `MIT` |
573
+ | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/ruby-oauth, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/warden_oauth, https://www.buymeacoffee.com/pboling |
574
+ <!-- kettle-jem:metadata:end -->