rodauth-oauth 1.5.0 → 1.6.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: 40ff3b3b3de0595eae98f218aec2f8e876f18329061c537e91e5841ab35e67dc
4
- data.tar.gz: 19692e86d66400a9e7227f655bdc6375e38554cb52b97ee3a5e22cceab582168
3
+ metadata.gz: 9fc6216412a63e6ce3b6beecf2d476b50b8e3445026927ce40cdc649023c1b15
4
+ data.tar.gz: d5f2f5ea24ade170615894f352a28ed428fac7a0bb39db4506d8343ead0c2e07
5
5
  SHA512:
6
- metadata.gz: cd6efdeda012c25d83949e7f0ea2aa043238851f95bf1217b8156786f7376d39792caed37a2af68fc7777ed5a892fa2f9e5185efe1f8a3e7168df07de84b954d
7
- data.tar.gz: 0e435eea239f81ff16db08b187ce7bb06ba3d25359603906e48610e38912162b35c79c3d8b7fbfa74df2c56f52bb653d61b999da76c1cc8d445f2077b876c578
6
+ metadata.gz: 984a083c4e8814244c8566106a757095ae046b049ad76c6fa2947e5a7d12b0bc63c5fba621c1a0674e3deb4246a7f09d228ee51bb0e4f16a81c25bcd1a28d04c
7
+ data.tar.gz: 0aafc4b37f059b134ce08940d8e38d9ed3afb577e80c790b646c45ce0792ba6d833582ac53c036f9449ee3b130f77e4f5fc9098ce1ed3614b969dd78219eecba
@@ -0,0 +1,18 @@
1
+ # 1.6.0
2
+
3
+ ## Improvements
4
+
5
+ ### "at+jwt" and "id_token+jwt" ty header in JWT tokens
6
+
7
+ In order to distinguish/identify tokens, JWT access tokens generated by the `oauth_jwt` feature will contain the "at+jwt" value in the "typ" header (which follows the [recomendation in the RFC](https://datatracker.ietf.org/doc/html/rfc9068#section-2.1)), whereas ID tokens generated by the `oidc` feature will contain the "id_token+jwt" value in the "typ" header (there is no official recommendation, but some providers are using this).
8
+
9
+ **Note**: This header will also be used to validate access tokens. This means that, once you upgrade, **access tokens generated prior to the upgrade won't be usable anymore**. In order to mitigate this and smoothen the upgrade process, disable header verification for a period greater than the access token expiration time in your application (controlled by the `oauth_access_token_expires_in` auth value method, 60 minutes by default); this will allow older access tokens to expire. You can so by overriding the `verify_access_token_headers` auth method:
10
+
11
+ ```ruby
12
+
13
+ rodauth do
14
+ enable :oauth_jwt # or :oidc
15
+ oauth_access_token_expires_in 60 * 60
16
+
17
+ verify_access_token_headers { } # do nothing
18
+ end
@@ -9,7 +9,10 @@ module Rodauth
9
9
 
10
10
  auth_value_method :oauth_jwt_access_tokens, true
11
11
 
12
- auth_methods(:jwt_claims)
12
+ auth_methods(
13
+ :jwt_claims,
14
+ :verify_access_token_headers
15
+ )
13
16
 
14
17
  def require_oauth_authorization(*scopes)
15
18
  return super unless oauth_jwt_access_tokens
@@ -53,10 +56,14 @@ module Rodauth
53
56
  @authorization_token = decode_access_token
54
57
  end
55
58
 
59
+ def verify_access_token_headers(headers)
60
+ headers["typ"] == "at+jwt"
61
+ end
62
+
56
63
  def decode_access_token(access_token = fetch_access_token)
57
64
  return unless access_token
58
65
 
59
- jwt_claims = jwt_decode(access_token)
66
+ jwt_claims = jwt_decode(access_token, verify_headers: method(:verify_access_token_headers))
60
67
 
61
68
  return unless jwt_claims
62
69
 
@@ -94,7 +101,9 @@ module Rodauth
94
101
  # token data.
95
102
  claims[:scope] = oauth_grant[oauth_grants_scopes_column]
96
103
 
97
- jwt_encode(claims)
104
+ # RFC8725 section 3.11: Use Explicit Typing
105
+ # RFC9068 section 2.1 : The "typ" value used SHOULD be "at+jwt".
106
+ jwt_encode(claims, headers: { typ: "at+jwt" })
98
107
  end
99
108
 
100
109
  def _generate_access_token(*)
@@ -545,7 +545,11 @@ module Rodauth
545
545
  jwks: oauth_application_jwks(oauth_application),
546
546
  signing_algorithm: signing_algorithm,
547
547
  encryption_algorithm: oauth_application[oauth_applications_id_token_encrypted_response_alg_column],
548
- encryption_method: oauth_application[oauth_applications_id_token_encrypted_response_enc_column]
548
+ encryption_method: oauth_application[oauth_applications_id_token_encrypted_response_enc_column],
549
+
550
+ # Not officially part of the spec, but some providers follow this convention.
551
+ # This is useful for distinguishing between ID Tokens and JWT Access Tokens.
552
+ headers: { typ: "id_token+jwt" }
549
553
  }.compact
550
554
 
551
555
  oauth_grant[:id_token] = jwt_encode(id_claims, **params)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Rodauth
4
4
  module OAuth
5
- VERSION = "1.5.0"
5
+ VERSION = "1.6.0"
6
6
  end
7
7
  end
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: 1.5.0
4
+ version: 1.6.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: 2024-02-02 00:00:00.000000000 Z
11
+ date: 2024-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rodauth
@@ -74,6 +74,7 @@ extra_rdoc_files:
74
74
  - doc/release_notes/1_3_2.md
75
75
  - doc/release_notes/1_4_0.md
76
76
  - doc/release_notes/1_5_0.md
77
+ - doc/release_notes/1_6_0.md
77
78
  files:
78
79
  - CHANGELOG.md
79
80
  - LICENSE.txt
@@ -119,6 +120,7 @@ files:
119
120
  - doc/release_notes/1_3_2.md
120
121
  - doc/release_notes/1_4_0.md
121
122
  - doc/release_notes/1_5_0.md
123
+ - doc/release_notes/1_6_0.md
122
124
  - lib/generators/rodauth/oauth/install_generator.rb
123
125
  - lib/generators/rodauth/oauth/templates/app/models/oauth_application.rb
124
126
  - lib/generators/rodauth/oauth/templates/app/models/oauth_grant.rb