oauth2 1.4.2 → 1.4.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -2
  3. data/CODE_OF_CONDUCT.md +105 -46
  4. data/LICENSE +1 -1
  5. data/README.md +290 -102
  6. data/lib/oauth2/access_token.rb +15 -5
  7. data/lib/oauth2/authenticator.rb +13 -1
  8. data/lib/oauth2/client.rb +133 -51
  9. data/lib/oauth2/error.rb +3 -1
  10. data/lib/oauth2/mac_token.rb +18 -10
  11. data/lib/oauth2/response.rb +7 -3
  12. data/lib/oauth2/strategy/assertion.rb +6 -4
  13. data/lib/oauth2/strategy/auth_code.rb +3 -1
  14. data/lib/oauth2/strategy/base.rb +2 -0
  15. data/lib/oauth2/strategy/client_credentials.rb +3 -1
  16. data/lib/oauth2/strategy/implicit.rb +3 -1
  17. data/lib/oauth2/strategy/password.rb +5 -3
  18. data/lib/oauth2/version.rb +9 -3
  19. data/lib/oauth2.rb +2 -0
  20. data/spec/fixtures/README.md +11 -0
  21. data/spec/fixtures/RS256/jwtRS256.key +51 -0
  22. data/spec/fixtures/RS256/jwtRS256.key.pub +14 -0
  23. data/spec/helper.rb +33 -0
  24. data/spec/oauth2/access_token_spec.rb +218 -0
  25. data/spec/oauth2/authenticator_spec.rb +86 -0
  26. data/spec/oauth2/client_spec.rb +556 -0
  27. data/spec/oauth2/mac_token_spec.rb +122 -0
  28. data/spec/oauth2/response_spec.rb +96 -0
  29. data/spec/oauth2/strategy/assertion_spec.rb +113 -0
  30. data/spec/oauth2/strategy/auth_code_spec.rb +108 -0
  31. data/spec/oauth2/strategy/base_spec.rb +7 -0
  32. data/spec/oauth2/strategy/client_credentials_spec.rb +71 -0
  33. data/spec/oauth2/strategy/implicit_spec.rb +28 -0
  34. data/spec/oauth2/strategy/password_spec.rb +58 -0
  35. data/spec/oauth2/version_spec.rb +23 -0
  36. metadata +57 -95
  37. data/.document +0 -5
  38. data/.gitignore +0 -19
  39. data/.jrubyrc +0 -1
  40. data/.rspec +0 -2
  41. data/.rubocop.yml +0 -80
  42. data/.rubocop_rspec.yml +0 -26
  43. data/.rubocop_todo.yml +0 -15
  44. data/.ruby-version +0 -1
  45. data/.travis.yml +0 -70
  46. data/CONTRIBUTING.md +0 -18
  47. data/Gemfile +0 -40
  48. data/Rakefile +0 -45
  49. data/gemfiles/jruby_1.7.gemfile +0 -11
  50. data/gemfiles/jruby_9.0.gemfile +0 -7
  51. data/gemfiles/jruby_9.1.gemfile +0 -3
  52. data/gemfiles/jruby_9.2.gemfile +0 -3
  53. data/gemfiles/jruby_head.gemfile +0 -3
  54. data/gemfiles/ruby_1.9.gemfile +0 -11
  55. data/gemfiles/ruby_2.0.gemfile +0 -6
  56. data/gemfiles/ruby_2.1.gemfile +0 -6
  57. data/gemfiles/ruby_2.2.gemfile +0 -3
  58. data/gemfiles/ruby_2.3.gemfile +0 -3
  59. data/gemfiles/ruby_2.4.gemfile +0 -3
  60. data/gemfiles/ruby_2.5.gemfile +0 -3
  61. data/gemfiles/ruby_2.6.gemfile +0 -9
  62. data/gemfiles/ruby_head.gemfile +0 -9
  63. data/gemfiles/truffleruby.gemfile +0 -3
  64. data/oauth2.gemspec +0 -44
data/README.md CHANGED
@@ -1,55 +1,260 @@
1
- # OAuth2
2
-
3
- [![Gem Version](http://img.shields.io/gem/v/oauth2.svg)][gem]
4
- [![Total Downloads](https://img.shields.io/gem/dt/oauth2.svg)][gem]
5
- [![Downloads Today](https://img.shields.io/gem/rt/oauth2.svg)][gem]
6
- [![Build Status](https://travis-ci.org/oauth-xx/oauth2.svg?branch=1-4-stable)][travis]
7
- [![Coverage Status](http://img.shields.io/coveralls/intridea/oauth2.svg)][coveralls]
8
- [![Maintainability](https://api.codeclimate.com/v1/badges/688c612528ff90a46955/maintainability)][codeclimate-maintainability]
9
- [![Depfu](https://badges.depfu.com/badges/6d34dc1ba682bbdf9ae2a97848241743/count.svg)][depfu]
10
- [![Open Source Helpers](https://www.codetriage.com/oauth-xx/oauth2/badges/users.svg)][code-triage]
11
- [![Chat](https://img.shields.io/gitter/room/oauth-xx/oauth2.svg)](https://gitter.im/oauth-xx/oauth2)
12
- [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)][source-license]
13
- [![Documentation](http://inch-ci.org/github/oauth-xx/oauth2.png)][inch-ci]
14
-
15
- [gem]: https://rubygems.org/gems/oauth2
16
- [travis]: http://travis-ci.org/oauth-xx/oauth2
17
- [coveralls]: https://coveralls.io/r/oauth-xx/oauth2
18
- [codeclimate-maintainability]: https://codeclimate.com/github/oauth-xx/oauth2/maintainability
19
- [depfu]: https://depfu.com/github/oauth-xx/oauth2
20
- [source-license]: https://opensource.org/licenses/MIT
21
- [inch-ci]: http://inch-ci.org/github/oauth-xx/oauth2
22
- [code-triage]: https://www.codetriage.com/oauth-xx/oauth2
23
-
24
- A Ruby wrapper for the [OAuth 2.0 specification][oauth2-spec].
1
+ <p align="center">
2
+ <a href="http://oauth.net/2/" target="_blank" rel="noopener noreferrer">
3
+ <img src="https://github.com/oauth-xx/oauth2/raw/master/docs/images/logo/oauth2-logo-124px.png?raw=true" alt="OAuth 2.0 Logo by Chris Messina, CC BY-SA 3.0">
4
+ </a>
5
+ <a href="https://www.ruby-lang.org/" target="_blank" rel="noopener noreferrer">
6
+ <img width="124px" src="https://github.com/oauth-xx/oauth2/raw/master/docs/images/logo/ruby-logo-198px.svg?raw=true" alt="Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5">
7
+ </a>
8
+ </p>
9
+
10
+ ## What
11
+
12
+ OAuth 2.0 is the industry-standard protocol for authorization.
13
+ OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications,
14
+ desktop applications, mobile phones, and living room devices.
15
+ This is a RubyGem for implementing OAuth 2.0 clients and servers in Ruby applications.
16
+ See the sibling `oauth` gem for OAuth 1.0 implementations in Ruby.
17
+
18
+ ⚠️ **_WARNING_**: You are viewing the `README` of the soon-to-be-deprecated `1-4-stable`
19
+ branch which for version 1.4.x releases. Version 2.0 is coming! ⚠️
20
+
21
+ ---
22
+
23
+ * [OAuth 2.0 Spec][oauth2-spec]
24
+ * [OAuth 1.0 sibling gem][sibling-gem]
25
+ * Help us finish release [![2.0.0 release milestone][next-milestone-pct-img]][next-milestone-pct] by submitting or reviewing PRs and issues.
26
+ * Oauth2 gem is _always_ looking for additional maintainers. See [#307][maintainers-discussion].
25
27
 
26
28
  [oauth2-spec]: https://oauth.net/2/
29
+ [sibling-gem]: https://github.com/oauth-xx/oauth-ruby
30
+ [next-milestone-pct]: https://github.com/oauth-xx/oauth2/milestone/1
31
+ [next-milestone-pct-img]: https://img.shields.io/github/milestones/progress-percent/oauth-xx/oauth2/1
32
+ [maintainers-discussion]: https://github.com/oauth-xx/oauth2/issues/307
33
+
34
+ ## Release Documentation
35
+
36
+ <details>
37
+ <summary>1.4.x Readmes</summary>
38
+
39
+ | Version | Release Date | Readme |
40
+ |---------|--------------|----------------------------------------------------------|
41
+ | 1.4.8 | Feb 18, 2022 | https://github.com/oauth-xx/oauth2/blob/v1.4.8/README.md |
42
+ | 1.4.7 | Mar 19, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.7/README.md |
43
+ | 1.4.6 | Mar 19, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.6/README.md |
44
+ | 1.4.5 | Mar 18, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.5/README.md |
45
+ | 1.4.4 | Feb 12, 2020 | https://github.com/oauth-xx/oauth2/blob/v1.4.4/README.md |
46
+ | 1.4.3 | Jan 29, 2020 | https://github.com/oauth-xx/oauth2/blob/v1.4.3/README.md |
47
+ | 1.4.2 | Oct 1, 2019 | https://github.com/oauth-xx/oauth2/blob/v1.4.2/README.md |
48
+ | 1.4.1 | Oct 13, 2018 | https://github.com/oauth-xx/oauth2/blob/v1.4.1/README.md |
49
+ | 1.4.0 | Jun 9, 2017 | https://github.com/oauth-xx/oauth2/blob/v1.4.0/README.md |
50
+ </details>
51
+
52
+ <details>
53
+ <summary>1.3.x Readmes</summary>
54
+
55
+ | Version | Release Date | Readme |
56
+ |----------|--------------|----------------------------------------------------------|
57
+ | 1.3.1 | Mar 3, 2017 | https://github.com/oauth-xx/oauth2/blob/v1.3.1/README.md |
58
+ | 1.3.0 | Dec 27, 2016 | https://github.com/oauth-xx/oauth2/blob/v1.3.0/README.md |
59
+ </details>
60
+
61
+ <details>
62
+ <summary>&le;= 1.2.x Readmes (2016 and before)</summary>
63
+
64
+ | Version | Release Date | Readme |
65
+ |----------|--------------|----------------------------------------------------------|
66
+ | 1.2.0 | Jun 30, 2016 | https://github.com/oauth-xx/oauth2/blob/v1.2.0/README.md |
67
+ | 1.1.0 | Jan 30, 2016 | https://github.com/oauth-xx/oauth2/blob/v1.1.0/README.md |
68
+ | 1.0.0 | May 23, 2014 | https://github.com/oauth-xx/oauth2/blob/v1.0.0/README.md |
69
+ | < 1.0.0 | Find here | https://github.com/oauth-xx/oauth2/tags |
70
+ </details>
71
+
72
+ <!--
73
+ Numbering rows and badges in each row as a visual "database" lookup,
74
+ as the table is extremely dense, and it can be very difficult to find anything
75
+ Putting one on each row here, to document the emoji that should be used, and for ease of copy/paste.
76
+
77
+ row #s:
78
+ 1️⃣
79
+ 2️⃣
80
+ 3️⃣
81
+ 4️⃣
82
+ 5️⃣
83
+ 6️⃣
84
+ 7️⃣
85
+
86
+ badge #s:
87
+ ⛳️
88
+ 🖇
89
+ 🏘
90
+ 🚎
91
+ 🖐
92
+ 🧮
93
+ 📗
94
+ -->
95
+
96
+ | | Project | oauth2 |
97
+ |:----|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
98
+ | 1️⃣ | name, license, docs | [![RubyGems.org][⛳️name-img]][⛳️gem] [![License: MIT][🖇src-license-img]][🖇src-license] [![FOSSA][🏘fossa-img]][🏘fossa] [![RubyDoc.info][🚎yard-img]][🚎yard] [![InchCI][🖐inch-ci-img]][🚎yard] |
99
+ | 2️⃣ | version & activity | [![Gem Version][⛳️version-img]][⛳️gem] [![Total Downloads][🖇DL-total-img]][⛳️gem] [![Download Rank][🏘DL-rank-img]][⛳️gem] [![Source Code][🚎src-home-img]][🚎src-home] [![Open PRs][🖐prs-open-img]][🖐prs-open] [![Closed PRs][🧮prs-closed-img]][🧮prs-closed] |
100
+ | 3️⃣ | maintanence & linting | [![Maintainability][⛳cclim-maint-img]][⛳cclim-maint] [![Helpers][🖇triage-help-img]][🖇triage-help] [![Depfu][🏘depfu-img]][🏘depfu] [![Contributors][🚎contributors-img]][🚎contributors] [![Style][🖐style-wf-img]][🖐style-wf] [![Kloc Roll][🧮kloc-img]][🧮kloc] |
101
+ | 4️⃣ | testing | [![Build][⛳️tot-bld-img]][⛳️tot-bld] [![supported][🖇supported-wf-img]][🖇supported-wf] [![EOL & Code Coverage Build][🏘eol-wf-img]][🏘eol-wf] [![unsupported][🚎unsupported-wf-img]][🚎unsupported-wf] |
102
+ | 5️⃣ | coverage & security | [![CodeClimate][⛳cclim-cov-img]][⛳cclim-cov] [![CodeCov][🖇codecov-img]][🖇codecov] [![Coveralls][🏘coveralls-img]][🏘coveralls] [![Security Policy][🚎sec-pol-img]][🚎sec-pol] [![CodeQL][🖐codeQL-img]][🖐codeQL] |
103
+ | 6️⃣ | resources | [![Discussion][⛳gh-discussions-img]][⛳gh-discussions] [![Get help on Codementor][🖇codementor-img]][🖇codementor] [![Chat][🏘chat-img]][🏘chat] [![Blog][🚎blog-img]][🚎blog] [![Blog][🖐wiki-img]][🖐wiki] |
104
+ | 7️⃣ | spread 💖 | [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay] [![Sponsor Me][🖇sponsor-img]][🖇sponsor] [![Tweet @ Peter][🏘tweet-img]][🏘tweet] [🌏][aboutme] [👼][angelme] [💻][coderme] [🌹][politicme] |
105
+
106
+ <!--
107
+ The link tokens in the following sections should be kept ordered by the row and badge numbering scheme
108
+ -->
109
+
110
+ <!-- 1️⃣ name, license, docs -->
111
+ [⛳️gem]: https://rubygems.org/gems/oauth2
112
+ [⛳️name-img]: https://img.shields.io/badge/name-oauth2-brightgreen.svg?style=flat
113
+ [🖇src-license]: https://opensource.org/licenses/MIT
114
+ [🖇src-license-img]: https://img.shields.io/badge/License-MIT-green.svg
115
+ [🏘fossa]: https://app.fossa.io/projects/git%2Bgithub.com%2Foauth-xx%2Foauth2?ref=badge_shield
116
+ [🏘fossa-img]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Foauth-xx%2Foauth2.svg?type=shield
117
+ [🚎yard]: https://www.rubydoc.info/github/oauth-xx/oauth2
118
+ [🚎yard-img]: https://img.shields.io/badge/documentation-rubydoc-brightgreen.svg?style=flat
119
+ [🖐inch-ci-img]: http://inch-ci.org/github/oauth-xx/oauth2.png
120
+
121
+ <!-- 2️⃣ version & activity -->
122
+ [⛳️version-img]: http://img.shields.io/gem/v/oauth2.svg
123
+ [🖇DL-total-img]: https://img.shields.io/gem/dt/oauth2.svg
124
+ [🏘DL-rank-img]: https://img.shields.io/gem/rt/oauth2.svg
125
+ [🚎src-home]: https://github.com/oauth-xx/oauth2
126
+ [🚎src-home-img]: https://img.shields.io/badge/source-github-brightgreen.svg?style=flat
127
+ [🖐prs-open]: https://github.com/oauth-xx/oauth2/pulls
128
+ [🖐prs-open-img]: https://img.shields.io/github/issues-pr/oauth-xx/oauth2
129
+ [🧮prs-closed]: https://github.com/oauth-xx/oauth2/pulls?q=is%3Apr+is%3Aclosed
130
+ [🧮prs-closed-img]: https://img.shields.io/github/issues-pr-closed/oauth-xx/oauth2
131
+
132
+ <!-- 3️⃣ maintanence & linting -->
133
+ [⛳cclim-maint]: https://codeclimate.com/github/oauth-xx/oauth2/maintainability
134
+ [⛳cclim-maint-img]: https://api.codeclimate.com/v1/badges/688c612528ff90a46955/maintainability
135
+ [🖇triage-help]: https://www.codetriage.com/oauth-xx/oauth2
136
+ [🖇triage-help-img]: https://www.codetriage.com/oauth-xx/oauth2/badges/users.svg
137
+ [🏘depfu]: https://depfu.com/github/oauth-xx/oauth2?project_id=4445
138
+ [🏘depfu-img]: https://badges.depfu.com/badges/6d34dc1ba682bbdf9ae2a97848241743/count.svg
139
+ [🚎contributors]: https://github.com/oauth-xx/oauth2/graphs/contributors
140
+ [🚎contributors-img]: https://img.shields.io/github/contributors-anon/oauth-xx/oauth2
141
+ [🖐style-wf]: https://github.com/oauth-xx/oauth2/actions/workflows/style.yml
142
+ [🖐style-wf-img]: https://github.com/oauth-xx/oauth2/actions/workflows/style.yml/badge.svg
143
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
144
+ [🧮kloc-img]: https://img.shields.io/tokei/lines/github.com/oauth-xx/oauth2
145
+
146
+ <!-- 4️⃣ testing -->
147
+ [⛳️tot-bld]: https://actions-badge.atrox.dev/oauth-xx/oauth2/goto
148
+ [⛳️tot-bld-img]: https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Foauth-xx%2Foauth2%2Fbadge&style=flat
149
+ [🖇supported-wf]: https://github.com/oauth-xx/oauth2/actions/workflows/supported.yml
150
+ [🖇supported-wf-img]: https://github.com/oauth-xx/oauth2/actions/workflows/supported.yml/badge.svg
151
+ [🏘eol-wf]: https://github.com/oauth-xx/oauth2/actions/workflows/coverage.yml
152
+ [🏘eol-wf-img]: https://github.com/oauth-xx/oauth2/actions/workflows/coverage.yml/badge.svg
153
+ [🚎unsupported-wf]: https://github.com/oauth-xx/oauth2/actions/workflows/unsupported.yml
154
+ [🚎unsupported-wf-img]: https://github.com/oauth-xx/oauth2/actions/workflows/unsupported.yml/badge.svg
155
+ [🖐issues]: https://github.com/oauth-xx/oauth2/issues
156
+ [🖐issues-img]: https://github.com/oauth-xx/oauth2/issues
157
+
158
+ <!-- 5️⃣ coverage & security -->
159
+ [⛳cclim-cov]: https://codeclimate.com/github/oauth-xx/oauth2/test_coverage
160
+ [⛳cclim-cov-img]: https://api.codeclimate.com/v1/badges/688c612528ff90a46955/test_coverage
161
+ [🖇codecov-img]: https://codecov.io/gh/oauth-xx/oauth2/branch/1-4-stable/graph/badge.svg?token=bNqSzNiuo2
162
+ [🖇codecov]: https://codecov.io/gh/oauth-xx/oauth2
163
+ [🏘coveralls]: https://coveralls.io/github/oauth-xx/oauth2?branch=1-4-stable
164
+ [🏘coveralls-img]: https://coveralls.io/repos/github/oauth-xx/oauth2/badge.svg?branch=1-4-stable
165
+ [🚎sec-pol]: https://github.com/oauth-xx/oauth2/blob/master/SECURITY.md
166
+ [🚎sec-pol-img]: https://img.shields.io/badge/security-policy-brightgreen.svg?style=flat
167
+ [🖐codeQL]: https://github.com/oauth-xx/oauth2/security/code-scanning
168
+ [🖐codeQL-img]: https://github.com/oauth-xx/oauth2/actions/workflows/codeql-analysis.yml/badge.svg
169
+
170
+ <!-- 6️⃣ resources -->
171
+ [⛳gh-discussions]: https://github.com/oauth-xx/oauth2/discussions
172
+ [⛳gh-discussions-img]: https://img.shields.io/github/discussions/oauth-xx/oauth2
173
+ [🖇codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
174
+ [🖇codementor-img]: https://cdn.codementor.io/badges/get_help_github.svg
175
+ [🏘chat]: https://gitter.im/oauth-xx/oauth2
176
+ [🏘chat-img]: https://img.shields.io/gitter/room/oauth-xx/oauth2.svg
177
+ [🚎blog]: http://www.railsbling.com/tags/oauth2/
178
+ [🚎blog-img]: https://img.shields.io/badge/blog-railsbling-brightgreen.svg?style=flat
179
+ [🖐wiki]: https://github.com/oauth-xx/oauth2/wiki
180
+ [🖐wiki-img]: https://img.shields.io/badge/wiki-examples-brightgreen.svg?style=flat
181
+
182
+ <!-- 7️⃣ spread 💖 -->
183
+ [⛳liberapay-img]: https://img.shields.io/liberapay/patrons/pboling.svg?logo=liberapay
184
+ [⛳liberapay]: https://liberapay.com/pboling/donate
185
+ [🖇sponsor-img]: https://img.shields.io/badge/sponsor-pboling.svg?style=social&logo=github
186
+ [🖇sponsor]: https://github.com/sponsors/pboling
187
+ [🏘tweet-img]: https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow
188
+ [🏘tweet]: http://twitter.com/galtzo
189
+
190
+ <!-- Maintainer Contact Links -->
191
+ [railsbling]: http://www.railsbling.com
192
+ [peterboling]: http://www.peterboling.com
193
+ [aboutme]: https://about.me/peter.boling
194
+ [angelme]: https://angel.co/peter-boling
195
+ [coderme]:http://coderwall.com/pboling
196
+ [politicme]: https://nationalprogressiveparty.org
197
+
27
198
 
28
199
  ## Installation
29
200
 
30
- Add this line to your application's Gemfile:
201
+ ```shell
202
+ gem install oauth2
203
+ ```
204
+
205
+ Or inside a `Gemfile`
31
206
 
32
207
  ```ruby
33
208
  gem 'oauth2'
34
209
  ```
210
+ And then execute in a shell:
211
+ ```shell
212
+ bundle
213
+ ```
214
+
35
215
 
36
- And then execute:
216
+ ## Compatibility
37
217
 
38
- $ bundle
218
+ Targeted ruby compatibility is non-EOL versions of Ruby, currently 2.7, 3.0 and
219
+ 3.1. Compatibility is further distinguished by supported and unsupported versions of Ruby.
220
+ Ruby is limited to 1.9+ in the gemspec for the 1.4.x series and will be 2.2+ for 2.x releases (see `master` branch).
39
221
 
40
- Or install it yourself as:
222
+ <details>
223
+ <summary>Ruby Engine Compatibility Policy</summary>
41
224
 
42
- $ gem install oauth2
225
+ This gem is tested against MRI, JRuby, and Truffleruby.
226
+ Each of those has varying versions that target a specific version of MRI Ruby.
227
+ This gem should work in the just-listed Ruby engines according to the targeted MRI compatibility in the table below.
228
+ If you would like to add support for additional engines,
229
+ first make sure Github Actions supports the engine,
230
+ then submit a PR to the correct maintenance branch as according to the table below.
231
+ </details>
232
+
233
+ <details>
234
+ <summary>Ruby Version Compatibility Policy</summary>
235
+
236
+ If something doesn't work on one of these interpreters, it's a bug.
237
+
238
+ This library may inadvertently work (or seem to work) on other Ruby
239
+ implementations, however support will only be provided for the versions listed
240
+ above.
43
241
 
44
- ## Resources
242
+ If you would like this library to support another Ruby version, you may
243
+ volunteer to be a maintainer. Being a maintainer entails making sure all tests
244
+ run and pass on that implementation. When something breaks on your
245
+ implementation, you will be responsible for providing patches in a timely
246
+ fashion. If critical issues for a particular implementation exist at the time
247
+ of a major release, support for that Ruby version may be dropped.
248
+ </details>
45
249
 
46
- * [View Source on GitHub][code]
47
- * [Report Issues on GitHub][issues]
48
- * [Read More at the Wiki][wiki]
250
+ | | Ruby OAuth 2 Version | Maintenance Branch | Supported Officially | Supported Unofficially | Supported Incidentally |
251
+ |:----|----------------------|--------------------|-------------------------|------------------------|------------------------|
252
+ | 1️⃣ | 2.0.x (unreleased) | `master` | 2.7, 3.0, 3.1 | 2.6, 2.5 | 2.4, 2.3, 2.2 |
253
+ | 2️⃣ | 1.4.x | `1-4-stable` | 2.5, 2.6, 2.7, 3.0, 3.1 | 2.1, 2.2, 2.3, 2.4 | 2.0, 1.9 |
254
+ | 3️⃣ | older | N/A | Best of luck to you! | Please upgrade! | |
49
255
 
50
- [code]: https://github.com/oauth-xx/oauth2
51
- [issues]: https://github.com/oauth-xx/oauth2/issues
52
- [wiki]: https://github.com/oauth-xx/oauth2/wiki
256
+ NOTE: Once 2.0 is released, the 1.4 series will only receive critical bug and security updates.
257
+ See [SECURITY.md][🚎sec-pol]
53
258
 
54
259
  ## Usage Examples
55
260
 
@@ -61,16 +266,42 @@ client.auth_code.authorize_url(:redirect_uri => 'http://localhost:8080/oauth2/ca
61
266
  # => "https://example.org/oauth/authorization?response_type=code&client_id=client_id&redirect_uri=http://localhost:8080/oauth2/callback"
62
267
 
63
268
  token = client.auth_code.get_token('authorization_code_value', :redirect_uri => 'http://localhost:8080/oauth2/callback', :headers => {'Authorization' => 'Basic some_password'})
64
- response = token.get('/api/resource', :params => { 'query_foo' => 'bar' })
269
+ response = token.get('/api/resource', :params => {'query_foo' => 'bar'})
65
270
  response.class.name
66
271
  # => OAuth2::Response
67
272
  ```
273
+
274
+ <details>
275
+ <summary>Debugging</summary>
276
+
277
+ Set an environment variable, however you would [normally do that](https://github.com/bkeepers/dotenv).
278
+
279
+ ```ruby
280
+ # will log both request and response, including bodies
281
+ ENV['OAUTH_DEBUG'] = 'true'
282
+ ```
283
+
284
+ By default, debug output will go to `$stdout`. This can be overridden when
285
+ initializing your OAuth2::Client.
286
+
287
+ ```ruby
288
+ require 'oauth2'
289
+ client = OAuth2::Client.new(
290
+ 'client_id',
291
+ 'client_secret',
292
+ :site => 'https://example.org',
293
+ :logger => Logger.new('example.log', 'weekly')
294
+ )
295
+ ```
296
+ </details>
297
+
68
298
  ## OAuth2::Response
69
- The AccessToken methods #get, #post, #put and #delete and the generic #request
299
+
300
+ The `AccessToken` methods `#get`, `#post`, `#put` and `#delete` and the generic `#request`
70
301
  will return an instance of the #OAuth2::Response class.
71
302
 
72
- This instance contains a #parsed method that will parse the response body and
73
- return a Hash if the Content-Type is application/x-www-form-urlencoded or if
303
+ This instance contains a `#parsed` method that will parse the response body and
304
+ return a Hash if the `Content-Type` is `application/x-www-form-urlencoded` or if
74
305
  the body is a JSON object. It will return an Array if the body is a JSON
75
306
  array. Otherwise, it will return the original body string.
76
307
 
@@ -78,26 +309,29 @@ The original response body, headers, and status can be accessed via their
78
309
  respective methods.
79
310
 
80
311
  ## OAuth2::AccessToken
312
+
81
313
  If you have an existing Access Token for a user, you can initialize an instance
82
- using various class methods including the standard new, from_hash (if you have
83
- a hash of the values), or from_kvform (if you have an
84
- application/x-www-form-urlencoded encoded string of the values).
314
+ using various class methods including the standard new, `from_hash` (if you have
315
+ a hash of the values), or `from_kvform` (if you have an
316
+ `application/x-www-form-urlencoded` encoded string of the values).
85
317
 
86
318
  ## OAuth2::Error
87
- On 400+ status code responses, an OAuth2::Error will be raised. If it is a
88
- standard OAuth2 error response, the body will be parsed and #code and #description will contain the values provided from the error and
89
- error_description parameters. The #response property of OAuth2::Error will
90
- always contain the OAuth2::Response instance.
91
319
 
92
- If you do not want an error to be raised, you may use :raise_errors => false
93
- option on initialization of the client. In this case the OAuth2::Response
320
+ On 400+ status code responses, an `OAuth2::Error` will be raised. If it is a
321
+ standard OAuth2 error response, the body will be parsed and `#code` and `#description` will contain the values provided from the error and
322
+ `error_description` parameters. The `#response` property of `OAuth2::Error` will
323
+ always contain the `OAuth2::Response` instance.
324
+
325
+ If you do not want an error to be raised, you may use `:raise_errors => false`
326
+ option on initialization of the client. In this case the `OAuth2::Response`
94
327
  instance will be returned as usual and on 400+ status code responses, the
95
- Response instance will contain the OAuth2::Error instance.
328
+ Response instance will contain the `OAuth2::Error` instance.
96
329
 
97
330
  ## Authorization Grants
331
+
98
332
  Currently the Authorization Code, Implicit, Resource Owner Password Credentials, Client Credentials, and Assertion
99
333
  authentication grant types have helper strategy classes that simplify client
100
- use. They are available via the #auth_code, #implicit, #password, #client_credentials, and #assertion methods respectively.
334
+ use. They are available via the `#auth_code`, `#implicit`, `#password`, `#client_credentials`, and `#assertion` methods respectively.
101
335
 
102
336
  ```ruby
103
337
  auth_url = client.auth_code.authorize_url(:redirect_uri => 'http://localhost:8080/oauth/callback')
@@ -121,55 +355,9 @@ request, add a 'headers' hash under 'params':
121
355
  token = client.auth_code.get_token('code_value', :redirect_uri => 'http://localhost:8080/oauth/callback', :headers => {'Some' => 'Header'})
122
356
  ```
123
357
 
124
- You can always use the #request method on the OAuth2::Client instance to make
358
+ You can always use the `#request` method on the `OAuth2::Client` instance to make
125
359
  requests for tokens for any Authentication grant type.
126
360
 
127
- ## Supported Ruby Versions
128
-
129
- This library aims to support and is [tested against][travis] the following Ruby
130
- implementations:
131
-
132
- ### Rubies with support ending at Oauth2 1.x
133
-
134
- * Ruby 1.9.3
135
- - [JRuby 1.7][jruby-1.7] (targets MRI v1.9)
136
-
137
- * Ruby 2.0.0
138
- - [JRuby 9.0][jruby-9.0] (targets MRI v2.0)
139
- * Ruby 2.1
140
-
141
- ---
142
-
143
- ### Rubies with continued support past Oauth2 2.x
144
-
145
- * Ruby 2.2 - Support ends with version 2.x series
146
- * Ruby 2.3 - Support ends with version 3.x series
147
- - [JRuby 9.1][jruby-9.1] (targets MRI v2.3)
148
- * Ruby 2.4 - Support ends with version 4.x series
149
- * Ruby 2.5 - Support ends with version 5.x series
150
- - [JRuby 9.2][jruby-9.2] (targets MRI v2.5)
151
- - [truffleruby][truffleruby] (targets MRI 2.5)
152
- * Ruby 2.6 - Support ends with version 6.x series
153
-
154
- [jruby-1.7]: https://www.jruby.org/2017/05/11/jruby-1-7-27.html
155
- [jruby-9.0]: https://www.jruby.org/2016/01/26/jruby-9-0-5-0.html
156
- [jruby-9.1]: https://www.jruby.org/2017/05/16/jruby-9-1-9-0.html
157
- [jruby-9.2]: https://www.jruby.org/2018/05/24/jruby-9-2-0-0.html
158
- [truffleruby]: https://github.com/oracle/truffleruby
159
-
160
- If something doesn't work on one of these interpreters, it's a bug.
161
-
162
- This library may inadvertently work (or seem to work) on other Ruby
163
- implementations, however support will only be provided for the versions listed
164
- above.
165
-
166
- If you would like this library to support another Ruby version, you may
167
- volunteer to be a maintainer. Being a maintainer entails making sure all tests
168
- run and pass on that implementation. When something breaks on your
169
- implementation, you will be responsible for providing patches in a timely
170
- fashion. If critical issues for a particular implementation exist at the time
171
- of a major release, support for that Ruby version may be dropped.
172
-
173
361
  ## Versioning
174
362
 
175
363
  This library aims to adhere to [Semantic Versioning 2.0.0][semver].
@@ -193,21 +381,21 @@ spec.add_dependency 'oauth2', '~> 1.4'
193
381
 
194
382
  ## License
195
383
 
196
- [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)][source-license]
384
+ [![License: MIT][🖇src-license-img]][🖇src-license]
197
385
 
198
386
  - Copyright (c) 2011-2013 Michael Bleigh and Intridea, Inc.
199
- - Copyright (c) 2017-2018 [oauth-xx organization][oauth-xx]
387
+ - Copyright (c) 2017-2022 [oauth-xx organization][oauth-xx]
200
388
  - See [LICENSE][license] for details.
201
389
 
202
390
  [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Foauth-xx%2Foauth2.svg?type=large)][fossa2]
203
391
 
204
- [license]: LICENSE
392
+ [license]: https://github.com/oauth-xx/oauth2/blob/master/LICENSE
205
393
  [oauth-xx]: https://github.com/oauth-xx
206
394
  [fossa2]: https://app.fossa.io/projects/git%2Bgithub.com%2Foauth-xx%2Foauth2?ref=badge_large
207
395
 
208
396
  ## Development
209
397
 
210
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
398
+ After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle excec rake spec` to run the tests.
211
399
 
212
400
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
213
401
 
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  class AccessToken
3
5
  attr_reader :client, :token, :expires_in, :expires_at, :params
4
6
  attr_accessor :options, :refresh_token
5
7
 
8
+ # Should these methods be deprecated?
6
9
  class << self
7
10
  # Initializes an AccessToken from a Hash
8
11
  #
@@ -37,7 +40,7 @@ module OAuth2
37
40
  # @option opts [String] :header_format ('Bearer %s') the string format to use for the Authorization header
38
41
  # @option opts [String] :param_name ('access_token') the parameter name to use for transmission of the
39
42
  # Access Token value in :body or :query transmission mode
40
- def initialize(client, token, opts = {}) # rubocop:disable Metrics/AbcSize
43
+ def initialize(client, token, opts = {})
41
44
  @client = client
42
45
  @token = token.to_s
43
46
  opts = opts.dup
@@ -46,11 +49,11 @@ module OAuth2
46
49
  end
47
50
  @expires_in ||= opts.delete('expires')
48
51
  @expires_in &&= @expires_in.to_i
49
- @expires_at &&= @expires_at.to_i
52
+ @expires_at &&= convert_expires_at(@expires_at)
50
53
  @expires_at ||= Time.now.to_i + @expires_in if @expires_in
51
- @options = {:mode => opts.delete(:mode) || :header,
54
+ @options = {:mode => opts.delete(:mode) || :header,
52
55
  :header_format => opts.delete(:header_format) || 'Bearer %s',
53
- :param_name => opts.delete(:param_name) || 'access_token'}
56
+ :param_name => opts.delete(:param_name) || 'access_token'}
54
57
  @params = opts
55
58
  end
56
59
 
@@ -81,6 +84,7 @@ module OAuth2
81
84
  # @note options should be carried over to the new AccessToken
82
85
  def refresh!(params = {})
83
86
  raise('A refresh_token is not available') unless refresh_token
87
+
84
88
  params[:grant_type] = 'refresh_token'
85
89
  params[:refresh_token] = refresh_token
86
90
  new_token = @client.get_token(params)
@@ -149,7 +153,7 @@ module OAuth2
149
153
 
150
154
  private
151
155
 
152
- def configure_authentication!(opts) # rubocop:disable MethodLength, Metrics/AbcSize
156
+ def configure_authentication!(opts)
153
157
  case options[:mode]
154
158
  when :header
155
159
  opts[:headers] ||= {}
@@ -169,5 +173,11 @@ module OAuth2
169
173
  raise("invalid :mode option of #{options[:mode]}")
170
174
  end
171
175
  end
176
+
177
+ def convert_expires_at(expires_at)
178
+ Time.iso8601(expires_at.to_s).to_i
179
+ rescue ArgumentError
180
+ expires_at.to_i
181
+ end
172
182
  end
173
183
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  module OAuth2
@@ -25,6 +27,10 @@ module OAuth2
25
27
  apply_basic_auth(params)
26
28
  when :request_body
27
29
  apply_params_auth(params)
30
+ when :tls_client_auth
31
+ apply_client_id(params)
32
+ when :private_key_jwt
33
+ params
28
34
  else
29
35
  raise NotImplementedError
30
36
  end
@@ -42,6 +48,12 @@ module OAuth2
42
48
  {'client_id' => id, 'client_secret' => secret}.merge(params)
43
49
  end
44
50
 
51
+ # When using schemes that don't require the client_secret to be passed i.e TLS Client Auth,
52
+ # we don't want to send the secret
53
+ def apply_client_id(params)
54
+ {'client_id' => id}.merge(params)
55
+ end
56
+
45
57
  # Adds an `Authorization` header with Basic Auth credentials if and only if
46
58
  # it is not already set in the params.
47
59
  def apply_basic_auth(params)
@@ -50,7 +62,7 @@ module OAuth2
50
62
  params.merge(:headers => headers)
51
63
  end
52
64
 
53
- # @see https://tools.ietf.org/html/rfc2617#section-2
65
+ # @see https://datatracker.ietf.org/doc/html/rfc2617#section-2
54
66
  def basic_auth_header
55
67
  {'Authorization' => self.class.encode_basic_auth(id, secret)}
56
68
  end