rodauth-oauth 0.5.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7324d08b229d4bfdea92df95c769539570565e161d758a38d95bea50f78fda96
4
- data.tar.gz: c421e4886baf39eb9ebe04e6919c6ab292d3c85dbc32bc78e5d8992c17a40816
3
+ metadata.gz: 91f66a3575e9f63b13eac64e44c3ce768fb5904ce5e77e0239e3f1f437c21fbf
4
+ data.tar.gz: bb80d8836f4ad0b99b8e75458861c36526b9a60e623f6d799ff88a751bfe9bc0
5
5
  SHA512:
6
- metadata.gz: 4ba7e8a7975260618034285b77d4489416fe368c500b31516e7dd69d89e75863e18bebdb4868a72caa61fa2ed93541f1da6ea1c9c9d4cf15072bf4008209a1a9
7
- data.tar.gz: 87e9f031183ede6af4f338f60ff5ae5f7a8581412068abb484b5312de4a6962fcaa68cb95eae8aab7c755adc4e1c0ada6e3e19b009ece35d4902cc84d1ab1e01
6
+ metadata.gz: '09a5d103d91e13b011456259b255ddd930692e5f50b9ebc892fa86c8ac48006e2815f7339cb10cf1d710eefd5ae18da56a08e43aedd47002bcbaa1cf82c59c6d'
7
+ data.tar.gz: 745409245789cb8e77a50724192b126e047a5258827bdec765bd2ff07ff3ff4c77bb44463bc513f384f35a3e470f67496a1f12a56777cb27c6af36e903febb7f
data/CHANGELOG.md CHANGED
@@ -2,6 +2,58 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ### 0.7.0 (02/12/2021)
6
+
7
+ #### Features
8
+
9
+ * Internationalization (i18n) support by hooking on [rodauth-oauth](https://github.com/janko/rodauth-i18n).
10
+ * Sets all text using `translatable_method`.
11
+ * Provides english translations for all `rodauth-oauth` related user facing text.
12
+
13
+ #### Improvements
14
+
15
+ * Enable CORS requests for OpenID configuration endpoint (@ianks)
16
+ * Introspect endpoint now exposes the `exp` token property (@gmanley)
17
+
18
+ #### Bugfixes
19
+
20
+ * on rotation policy, although the first refresh token was invalidated, a new one wasn't being provided. This change allows a new refresh token to be generated and exposed in the response (@gmanley)
21
+
22
+ #### Chore
23
+
24
+ Setting `rodauth` minimal supported version to `2.0.0`.
25
+
26
+ ### 0.6.1 (08/09/2021)
27
+
28
+ #### Bugfixes
29
+
30
+ * Fixed rails view templates escaping.
31
+ * Fixed declaration of authorize template in the generator.
32
+
33
+ ### 0.6.0 (21/05/2021)
34
+
35
+ ### Improvements
36
+
37
+ * RBS signatures
38
+
39
+ ### Chore
40
+
41
+ * Ruby 3 and Truffleruby are now officially supported and tested in CI.
42
+
43
+ ### 0.5.1 (19/03/2021)
44
+
45
+ #### Improvements
46
+
47
+ * Changing "Callback URL" to "Redirect URL" in default templates;
48
+
49
+ #### Bugfixes
50
+
51
+ * (rails integration) Fixed templates location;
52
+ * (rails integration) Fixed migration name from generator;
53
+ * (rails integration) fixed links, html tags, styling and unassigned variables from a few view templates;
54
+ * `oauth_application_path` is now compliant with prefixes and other url helpers, while now having a `oauth_application_url` counterpart;
55
+ * (rails integration) skipping csrf checks for "/userinfo" request (OIDC)
56
+
5
57
  ### 0.5.0 (08/02/2021)
6
58
 
7
59
  #### RP-Initiated Logout
data/README.md CHANGED
@@ -516,7 +516,7 @@ payload = json.parse(response.to_s)
516
516
  puts payload #=> {
517
517
  # "access_token" => ....
518
518
  # "mac_key" => ....
519
- # "mac_algorithm" =>
519
+ # "mac_algorithm" =>
520
520
  ```
521
521
 
522
522
  which you'll be able to use to generate the mac signature to send in the "Authorization" header.
@@ -565,7 +565,7 @@ plugin :rodauth do
565
565
  enable :oauth_jwt
566
566
  oauth_jwt_key rsa_private
567
567
  oauth_jwt_public_key rsa_public
568
- oauth_jwt_algorithm "RS256"
568
+ oauth_jwt_algorithm "RS256"
569
569
  end
570
570
  ```
571
571
 
@@ -581,7 +581,7 @@ plugin :rodauth do
581
581
  enable :oauth_jwt
582
582
  oauth_jwt_jwk_key rsa_private
583
583
  oauth_jwt_jwk_public_key rsa_public
584
- oauth_jwt_jwk_algorithm "RS256"
584
+ oauth_jwt_jwk_algorithm "RS256"
585
585
  end
586
586
  ```
587
587
 
@@ -627,17 +627,25 @@ puts payload #=> {
627
627
 
628
628
  You'll still need the "oauth_tokens" table, however you can remove the "token" column.
629
629
 
630
+ #### Internationalization (i18n)
631
+
632
+ `rodauth-oauth` supports translating all user-facing text found in all pages and forms, by integrating with [rodauth-i18n](https://github.com/janko/rodauth-i18n). Just set it up in your application and `rodauth` configuration.
633
+
634
+ Default translations shipping with `rodauth-oauth` can be found [in this directory](https://gitlab.com/honeyryderchuck/rodauth-oauth/-/tree/master/locales). If they're not available for the languages you'd like to support, consider getting them translated from the english text, and contributing them to this repository via a Merge Request.
635
+
636
+ (This feature is available since `v0.7`.)
637
+
630
638
  #### Caveats
631
639
 
632
640
  Although very handy for the mentioned use case, one can't revoke a JWT token on demand (it must expire first).
633
641
 
634
642
  ## Ruby support policy
635
643
 
636
- The minimum Ruby version required to run `rodauth-oauth` is 2.3 . Besides that, it should support all rubies that rodauth and roda support, including JRuby and (potentially, I don't know yet) truffleruby.
644
+ The minimum Ruby version required to run `rodauth-oauth` is 2.3 . Besides that, it should support all rubies that rodauth and roda support, including JRuby and truffleruby.
637
645
 
638
- ### JRuby
646
+ ### Rails
639
647
 
640
- If you're interested in using this library in rails, be sure to check `rodauth-rails` policy, as it supports rails 5.2 upwards.
648
+ If you're interested in using this library with rails, be sure to check `rodauth-rails` policy, as it supports rails 5.2 upwards.
641
649
 
642
650
  ## Development
643
651
 
@@ -646,4 +654,3 @@ After checking out the repo, run `bundle install` to install dependencies. Then,
646
654
  ## Contributing
647
655
 
648
656
  Bug reports and pull requests are welcome on Gitlab at https://gitlab.com/honeyryderchuck/rodauth-oauth.
649
-
@@ -1,4 +1,4 @@
1
- class CreateRodauthOAuth < ActiveRecord::Migration<%= migration_version %>
1
+ class CreateRodauthOauth < ActiveRecord::Migration<%= migration_version %>
2
2
  def change
3
3
  create_table :oauth_applications do |t|
4
4
  t.integer :account_id
@@ -9,7 +9,7 @@ module Rodauth::OAuth
9
9
  source_root "#{__dir__}/templates"
10
10
  namespace "rodauth:oauth:views"
11
11
 
12
- DEFAULT = %w[oauth_authorize].freeze
12
+ DEFAULT = %w[authorize].freeze
13
13
  VIEWS = {
14
14
  oauth_authorize: DEFAULT,
15
15
  oauth_applications: %w[oauth_applications oauth_application new_oauth_application]
@@ -9,7 +9,7 @@ require "rodauth/oauth/ttl_store"
9
9
  require "rodauth/oauth/database_extensions"
10
10
 
11
11
  module Rodauth
12
- Feature.define(:oauth) do
12
+ Feature.define(:oauth, :Oauth) do
13
13
  # RUBY EXTENSIONS
14
14
  unless Regexp.method_defined?(:match?)
15
15
  # If you wonder why this is there: the oauth feature uses a refinement to enhance the
@@ -139,7 +139,15 @@ module Rodauth
139
139
  auth_value_method :already_in_use_response_status, 409
140
140
 
141
141
  # OAuth Applications
142
- auth_value_method :oauth_applications_path, "oauth-applications"
142
+ auth_value_method :oauth_applications_route, "oauth-applications"
143
+ def oauth_applications_path(opts = {})
144
+ route_path(oauth_applications_route, opts)
145
+ end
146
+
147
+ def oauth_applications_url(opts = {})
148
+ route_url(oauth_applications_route, opts)
149
+ end
150
+
143
151
  auth_value_method :oauth_applications_table, :oauth_applications
144
152
 
145
153
  auth_value_method :oauth_applications_id_column, :id
@@ -160,24 +168,24 @@ module Rodauth
160
168
  auth_value_method :oauth_token_type, "bearer"
161
169
  auth_value_method :oauth_refresh_token_protection_policy, "none" # can be: none, sender_constrained, rotation
162
170
 
163
- auth_value_method :invalid_client_message, "Invalid client"
164
- auth_value_method :invalid_grant_type_message, "Invalid grant type"
165
- auth_value_method :invalid_grant_message, "Invalid grant"
166
- auth_value_method :invalid_scope_message, "Invalid scope"
171
+ translatable_method :invalid_client_message, "Invalid client"
172
+ translatable_method :invalid_grant_type_message, "Invalid grant type"
173
+ translatable_method :invalid_grant_message, "Invalid grant"
174
+ translatable_method :invalid_scope_message, "Invalid scope"
167
175
 
168
- auth_value_method :invalid_url_message, "Invalid URL"
169
- auth_value_method :unsupported_token_type_message, "Invalid token type hint"
176
+ translatable_method :invalid_url_message, "Invalid URL"
177
+ translatable_method :unsupported_token_type_message, "Invalid token type hint"
170
178
 
171
- auth_value_method :unique_error_message, "is already in use"
172
- auth_value_method :null_error_message, "is not filled"
173
- auth_value_method :already_in_use_message, "error generating unique token"
179
+ translatable_method :unique_error_message, "is already in use"
180
+ translatable_method :null_error_message, "is not filled"
181
+ translatable_method :already_in_use_message, "error generating unique token"
174
182
  auth_value_method :already_in_use_error_code, "invalid_request"
175
183
 
176
184
  # PKCE
177
185
  auth_value_method :code_challenge_required_error_code, "invalid_request"
178
- auth_value_method :code_challenge_required_message, "code challenge required"
186
+ translatable_method :code_challenge_required_message, "code challenge required"
179
187
  auth_value_method :unsupported_transform_algorithm_error_code, "invalid_request"
180
- auth_value_method :unsupported_transform_algorithm_message, "transform algorithm not supported"
188
+ translatable_method :unsupported_transform_algorithm_message, "transform algorithm not supported"
181
189
 
182
190
  # METADATA
183
191
  auth_value_method :oauth_metadata_service_documentation, nil
@@ -192,6 +200,7 @@ module Rodauth
192
200
  auth_value_method :oauth_unique_id_generation_retries, 3
193
201
 
194
202
  auth_value_methods(
203
+ :oauth_application_path,
195
204
  :fetch_access_token,
196
205
  :oauth_unique_id_generator,
197
206
  :secret_matches?,
@@ -363,9 +372,13 @@ module Rodauth
363
372
  end
364
373
  end
365
374
 
375
+ def oauth_application_path(id)
376
+ "#{oauth_applications_path}/#{id}"
377
+ end
378
+
366
379
  # /oauth-applications routes
367
380
  def oauth_applications
368
- request.on(oauth_applications_path) do
381
+ request.on(oauth_applications_route) do
369
382
  require_account
370
383
 
371
384
  request.get "new" do
@@ -422,16 +435,20 @@ module Rodauth
422
435
  false
423
436
  when revoke_path
424
437
  !json_request?
425
- when authorize_path, %r{/#{oauth_applications_path}}
438
+ when authorize_path, oauth_applications_path
426
439
  only_json? ? false : super
427
440
  else
428
441
  super
429
442
  end
430
443
  end
431
444
 
432
- # Overrides logged_in?, so that a valid authorization token also authnenticates a request
433
- def logged_in?
434
- super || authorization_token
445
+ # Overrides session_value, so that a valid authorization token also authenticates a request
446
+ def session_value
447
+ super || begin
448
+ return unless authorization_token
449
+
450
+ authorization_token[oauth_tokens_account_id_column]
451
+ end
435
452
  end
436
453
 
437
454
  def accepts_json?
@@ -449,10 +466,6 @@ module Rodauth
449
466
  end
450
467
  end
451
468
 
452
- def initialize(scope)
453
- @scope = scope
454
- end
455
-
456
469
  def scopes
457
470
  scope = request.params["scope"]
458
471
  case scope
@@ -551,12 +564,11 @@ module Rodauth
551
564
  self.class.__send__(:include, Rodauth::OAuth::ExtendDatabase(db))
552
565
 
553
566
  # Check whether we can reutilize db entries for the same account / application pair
554
- one_oauth_token_per_account = begin
555
- db.indexes(oauth_tokens_table).values.any? do |definition|
556
- definition[:unique] &&
557
- definition[:columns] == oauth_tokens_unique_columns
558
- end
567
+ one_oauth_token_per_account = db.indexes(oauth_tokens_table).values.any? do |definition|
568
+ definition[:unique] &&
569
+ definition[:columns] == oauth_tokens_unique_columns
559
570
  end
571
+
560
572
  self.class.send(:define_method, :__one_oauth_token_per_account) { one_oauth_token_per_account }
561
573
  end
562
574
 
@@ -1091,6 +1103,14 @@ module Rodauth
1091
1103
  oauth_tokens_scopes_column => oauth_token[oauth_tokens_scopes_column]
1092
1104
  }
1093
1105
 
1106
+ refresh_token = oauth_unique_id_generator
1107
+
1108
+ if oauth_tokens_refresh_token_hash_column
1109
+ insert_params[oauth_tokens_refresh_token_hash_column] = generate_token_hash(refresh_token)
1110
+ else
1111
+ insert_params[oauth_tokens_refresh_token_column] = refresh_token
1112
+ end
1113
+
1094
1114
  # revoke the refresh token
1095
1115
  oauth_tokens_ds.where(oauth_tokens_id_column => oauth_token[oauth_tokens_id_column])
1096
1116
  .update(oauth_tokens_revoked_at_column => Sequel::CURRENT_TIMESTAMP)
@@ -1104,6 +1124,7 @@ module Rodauth
1104
1124
  end
1105
1125
 
1106
1126
  oauth_token[oauth_tokens_token_column] = token
1127
+ oauth_token[oauth_tokens_refresh_token_column] = refresh_token if refresh_token
1107
1128
  oauth_token
1108
1129
  end
1109
1130
  end
@@ -1129,7 +1150,8 @@ module Rodauth
1129
1150
  scope: token[oauth_tokens_scopes_column],
1130
1151
  client_id: oauth_application[oauth_applications_client_id_column],
1131
1152
  # username
1132
- token_type: oauth_token_type
1153
+ token_type: oauth_token_type,
1154
+ exp: token[oauth_tokens_expires_in_column].to_i
1133
1155
  }
1134
1156
  end
1135
1157
 
@@ -1350,7 +1372,7 @@ module Rodauth
1350
1372
  issuer: issuer,
1351
1373
  authorization_endpoint: authorize_url,
1352
1374
  token_endpoint: token_url,
1353
- registration_endpoint: route_url(oauth_applications_path),
1375
+ registration_endpoint: oauth_applications_url,
1354
1376
  scopes_supported: oauth_application_scopes,
1355
1377
  response_types_supported: responses_supported,
1356
1378
  response_modes_supported: response_modes_supported,
@@ -1,7 +1,7 @@
1
1
  # frozen-string-literal: true
2
2
 
3
3
  module Rodauth
4
- Feature.define(:oauth_http_mac) do
4
+ Feature.define(:oauth_http_mac, :OauthHttpMac) do
5
5
  unless String.method_defined?(:delete_prefix)
6
6
  module PrefixExtensions
7
7
  refine(String) do
@@ -3,7 +3,7 @@
3
3
  require "rodauth/oauth/ttl_store"
4
4
 
5
5
  module Rodauth
6
- Feature.define(:oauth_jwt) do
6
+ Feature.define(:oauth_jwt, :OauthJwt) do
7
7
  depends :oauth
8
8
 
9
9
  JWKS = OAuth::TtlStore.new
@@ -33,8 +33,8 @@ module Rodauth
33
33
  auth_value_method :oauth_jwt_jwe_copyright, nil
34
34
  auth_value_method :oauth_jwt_audience, nil
35
35
 
36
- auth_value_method :request_uri_not_supported_message, "request uri is unsupported"
37
- auth_value_method :invalid_request_object_message, "request object is invalid"
36
+ translatable_method :request_uri_not_supported_message, "request uri is unsupported"
37
+ translatable_method :invalid_request_object_message, "request object is invalid"
38
38
 
39
39
  auth_value_methods(
40
40
  :jwt_encode,
@@ -62,6 +62,15 @@ module Rodauth
62
62
  authorization_required unless scopes.any? { |scope| token_scopes.include?(scope) }
63
63
  end
64
64
 
65
+ # Overrides session_value, so that a valid authorization token also authenticates a request
66
+ def session_value
67
+ super || begin
68
+ return unless authorization_token
69
+
70
+ authorization_token["sub"]
71
+ end
72
+ end
73
+
65
74
  private
66
75
 
67
76
  unless method_defined?(:last_account_login_at)
@@ -3,7 +3,7 @@
3
3
  require "onelogin/ruby-saml"
4
4
 
5
5
  module Rodauth
6
- Feature.define(:oauth_saml) do
6
+ Feature.define(:oauth_saml, :OauthSaml) do
7
7
  depends :oauth
8
8
 
9
9
  auth_value_method :oauth_saml_cert_fingerprint, "9E:65:2E:03:06:8D:80:F2:86:C7:6C:77:A1:D9:14:97:0A:4D:F4:4D"
@@ -1,7 +1,7 @@
1
1
  # frozen-string-literal: true
2
2
 
3
3
  module Rodauth
4
- Feature.define(:oidc) do
4
+ Feature.define(:oidc, :Oidc) do
5
5
  # https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims
6
6
  OIDC_SCOPES_MAP = {
7
7
  "profile" => %i[name family_name given_name middle_name nickname preferred_username
@@ -68,7 +68,7 @@ module Rodauth
68
68
  auth_value_method :oauth_grants_nonce_column, :nonce
69
69
  auth_value_method :oauth_tokens_nonce_column, :nonce
70
70
 
71
- auth_value_method :invalid_scope_message, "The Access Token expired"
71
+ translatable_method :invalid_scope_message, "The Access Token expired"
72
72
 
73
73
  auth_value_method :webfinger_relation, "http://openid.net/specs/connect/1.0/issuer"
74
74
 
@@ -186,6 +186,8 @@ module Rodauth
186
186
 
187
187
  def openid_configuration(alt_issuer = nil)
188
188
  request.on(".well-known/openid-configuration") do
189
+ allow_cors(request)
190
+
189
191
  request.get do
190
192
  json_response_success(openid_configuration_body(alt_issuer), cache: true)
191
193
  end
@@ -215,6 +217,15 @@ module Rodauth
215
217
  end
216
218
  end
217
219
 
220
+ def check_csrf?
221
+ case request.path
222
+ when userinfo_path
223
+ false
224
+ else
225
+ super
226
+ end
227
+ end
228
+
218
229
  private
219
230
 
220
231
  def require_authorizable_account
@@ -484,5 +495,15 @@ module Rodauth
484
495
  (val.respond_to?(:empty?) && val.empty?)
485
496
  end
486
497
  end
498
+
499
+ def allow_cors(request)
500
+ return unless request.request_method == "OPTIONS"
501
+
502
+ response["Access-Control-Allow-Origin"] = "*"
503
+ response["Access-Control-Allow-Methods"] = "GET, OPTIONS"
504
+ response["Access-Control-Max-Age"] = "3600"
505
+ response.status = 200
506
+ request.halt
507
+ end
487
508
  end
488
509
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Rodauth
4
4
  module OAuth
5
- VERSION = "0.5.0"
5
+ VERSION = "0.7.0"
6
6
  end
7
7
  end
data/lib/rodauth/oauth.rb CHANGED
@@ -5,3 +5,5 @@ require "rodauth"
5
5
  require "rodauth/oauth/version"
6
6
 
7
7
  require "rodauth/oauth/railtie" if defined?(Rails)
8
+
9
+ Rodauth::I18n.directories << File.expand_path(File.join(__dir__, "..", "..", "locales")) if defined?(Rodauth::I18n)
data/locales/en.yml ADDED
@@ -0,0 +1,34 @@
1
+ en:
2
+ rodauth:
3
+ require_authorization_error_flash: "Please authorize to continue"
4
+ create_oauth_application_error_flash: "There was an error registering your oauth application"
5
+ create_oauth_application_notice_flash: "Your oauth application has been registered"
6
+ revoke_oauth_token_notice_flash: "The oauth token has been revoked"
7
+ oauth_authorize_title: "Authorize"
8
+ oauth_oauth_applications_page_title: "Oauth Applications"
9
+ oauth_oauth_application_page_title: "Oauth Application"
10
+ oauth_new_oauth_application_page_title: "New Oauth Application"
11
+ oauth_oauth_tokens_page_title: "Oauth Tokens"
12
+ name_label: "Name"
13
+ description_label: "Description"
14
+ scopes_label: "Scopes"
15
+ homepage_url_label: "Homepage URL"
16
+ redirect_uri_label: "Redirect URL"
17
+ client_secret_label: "Client Secret"
18
+ client_id_label: "Client ID"
19
+ oauth_applications_button: "Register"
20
+ oauth_authorize_button: "Authorize"
21
+ oauth_token_revoke_button: "Revoke"
22
+ oauth_authorize_post_button: "Back to Client Application"
23
+ invalid_grant_message: "Invalid grant"
24
+ invalid_scope_message: "Invalid scope"
25
+ invalid_url_message: "Invalid URL"
26
+ unsupported_token_type_message: "Invalid token type hint"
27
+ unique_error_message: "is already in use"
28
+ null_error_message: "is not filled"
29
+ already_in_use_message: "error generating unique token"
30
+ code_challenge_required_message: "code challenge required"
31
+ unsupported_transform_algorithm_message: "transform algorithm not supported"
32
+ request_uri_not_supported_message: "request uri is unsupported"
33
+ invalid_request_object_message: "request object is invalid"
34
+ invalid_scope_message: "The Access Token expired"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth-oauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-08 00:00:00.000000000 Z
11
+ date: 2021-12-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Implementation of the OAuth 2.0 protocol on top of rodauth.
14
14
  email:
@@ -23,12 +23,12 @@ files:
23
23
  - CHANGELOG.md
24
24
  - LICENSE.txt
25
25
  - README.md
26
- - lib/generators/roda/oauth/install_generator.rb
27
- - lib/generators/roda/oauth/templates/app/models/oauth_application.rb
28
- - lib/generators/roda/oauth/templates/app/models/oauth_grant.rb
29
- - lib/generators/roda/oauth/templates/app/models/oauth_token.rb
30
- - lib/generators/roda/oauth/templates/db/migrate/create_rodauth_oauth.rb
31
- - lib/generators/roda/oauth/views_generator.rb
26
+ - lib/generators/rodauth/oauth/install_generator.rb
27
+ - lib/generators/rodauth/oauth/templates/app/models/oauth_application.rb
28
+ - lib/generators/rodauth/oauth/templates/app/models/oauth_grant.rb
29
+ - lib/generators/rodauth/oauth/templates/app/models/oauth_token.rb
30
+ - lib/generators/rodauth/oauth/templates/db/migrate/create_rodauth_oauth.rb
31
+ - lib/generators/rodauth/oauth/views_generator.rb
32
32
  - lib/rodauth/features/oauth.rb
33
33
  - lib/rodauth/features/oauth_http_mac.rb
34
34
  - lib/rodauth/features/oauth_jwt.rb
@@ -39,6 +39,7 @@ files:
39
39
  - lib/rodauth/oauth/railtie.rb
40
40
  - lib/rodauth/oauth/ttl_store.rb
41
41
  - lib/rodauth/oauth/version.rb
42
+ - locales/en.yml
42
43
  - templates/authorize.str
43
44
  - templates/client_secret_field.str
44
45
  - templates/description_field.str
@@ -71,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
72
  - !ruby/object:Gem::Version
72
73
  version: '0'
73
74
  requirements: []
74
- rubygems_version: 3.2.3
75
+ rubygems_version: 3.2.22
75
76
  signing_key:
76
77
  specification_version: 4
77
78
  summary: Implementation of the OAuth 2.0 protocol on top of rodauth.