rodauth-oauth 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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.