auth0 5.13.0 → 5.14.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: cb764cc8daf156b3d3736bff8c65c69c32db6d15757f2e450ea85eb0dca300c0
4
- data.tar.gz: b0cfc02df42818062bc5cb609daaffd04806f9ea92f771caf58575b9faa781c8
3
+ metadata.gz: b34c959171acbebc0ef4f851232de93af1d70318bb762243903d5269275843fa
4
+ data.tar.gz: 2856980051e6dec9ede6569c185516ffd08d2dfa4918a96a5fc4d0f96e17d44c
5
5
  SHA512:
6
- metadata.gz: 68c6502714f8c631aa92a0b29d387e662cf06b9ec4e18f4d12e3260a7068a5e754b1f29bc60a76b2defa54763919ee9b6e31ffb5181d1c0d38c584bf4d0186a3
7
- data.tar.gz: 26a2e83b7aa49807d45cda688d857d8dc93177bdd4a47b92b0e952561a2dbda2a056a15c537b71a787d22ddebb5ebb4fddb9f7e83fb26ce7e769b1c23a49c221
6
+ metadata.gz: 9e551b02de8f4464e4c688259dc0840844aa3cc80111a78254a7082a67b76209e1a991cbe241d7fc3839fea0fac00bdaf0917863d306c54bd51def3db524cc79
7
+ data.tar.gz: '092c26e20e6b6a850fde55c8beb8f4535a31e20db4144dd001feada3ca4256223580d56e82176ab4264d9146dd0de42610eb77a0ebf7fce9002e489681f9b7ae'
@@ -1,7 +1,7 @@
1
1
  # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.245.2/containers/ruby/.devcontainer/base.Dockerfile
2
2
 
3
3
  # [Choice] Ruby version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.1, 3.0, 2, 2.7, 3-bullseye, 3.1-bullseye, 3.0-bullseye, 2-bullseye, 2.7-bullseye, 3-buster, 3.1-buster, 3.0-buster, 2-buster, 2.7-buster
4
- ARG VARIANT="3.1-bullseye"
4
+ ARG VARIANT="3.2-bullseye"
5
5
  FROM mcr.microsoft.com/vscode/devcontainers/ruby:0-${VARIANT}
6
6
 
7
7
  # [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
@@ -0,0 +1,67 @@
1
+ name: 🐞 Report a bug
2
+ description: Have you found a bug or issue? Create a bug report for this library
3
+ labels: ["bug"]
4
+
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ **Please do not report security vulnerabilities here**. The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues.
10
+
11
+ - type: checkboxes
12
+ id: checklist
13
+ attributes:
14
+ label: Checklist
15
+ options:
16
+ - label: I have looked into the [Readme](https://github.com/auth0/ruby-auth0#readme) and [Examples](https://github.com/auth0/ruby-auth0/blob/master/EXAMPLES.md), and have not found a suitable solution or answer.
17
+ required: true
18
+ - label: I have looked into the [API documentation](https://www.rubydoc.info/gems/auth0) and have not found a suitable solution or answer.
19
+ required: true
20
+ - label: I have searched the [issues](https://github.com/auth0/ruby-auth0/issues) and have not found a suitable solution or answer.
21
+ required: true
22
+ - label: I have searched the [Auth0 Community](https://community.auth0.com) forums and have not found a suitable solution or answer.
23
+ required: true
24
+ - label: I agree to the terms within the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
25
+ required: true
26
+
27
+ - type: textarea
28
+ id: description
29
+ attributes:
30
+ label: Description
31
+ description: Provide a clear and concise description of the issue, including what you expected to happen.
32
+ validations:
33
+ required: true
34
+
35
+ - type: textarea
36
+ id: reproduction
37
+ attributes:
38
+ label: Reproduction
39
+ description: Detail the steps taken to reproduce this error, and whether this issue can be reproduced consistently or if it is intermittent.
40
+ placeholder: |
41
+ 1. Step 1...
42
+ 2. Step 2...
43
+ 3. ...
44
+ validations:
45
+ required: true
46
+
47
+ - type: textarea
48
+ id: additional-context
49
+ attributes:
50
+ label: Additional context
51
+ description: Other libraries that might be involved, or any other relevant information you think would be useful.
52
+ validations:
53
+ required: false
54
+
55
+ - type: input
56
+ id: environment-version
57
+ attributes:
58
+ label: ruby-auth0 version
59
+ validations:
60
+ required: true
61
+
62
+ - type: input
63
+ id: environment-ruby-version
64
+ attributes:
65
+ label: Ruby version
66
+ validations:
67
+ required: true
@@ -0,0 +1,53 @@
1
+ name: 🧩 Feature request
2
+ description: Suggest an idea or a feature for this library
3
+ labels: ["feature request"]
4
+
5
+ body:
6
+ - type: checkboxes
7
+ id: checklist
8
+ attributes:
9
+ label: Checklist
10
+ options:
11
+ - label: I have looked into the [Readme](https://github.com/auth0/ruby-auth0#readme) and [Examples](https://github.com/auth0/ruby-auth0/blob/master/EXAMPLES.md), and have not found a suitable solution or answer.
12
+ required: true
13
+ - label: I have looked into the [API documentation](https://www.rubydoc.info/gems/auth0) and have not found a suitable solution or answer.
14
+ required: true
15
+ - label: I have searched the [issues](https://github.com/auth0/ruby-auth0/issues) and have not found a suitable solution or answer.
16
+ required: true
17
+ - label: I have searched the [Auth0 Community](https://community.auth0.com) forums and have not found a suitable solution or answer.
18
+ required: true
19
+ - label: I agree to the terms within the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
20
+ required: true
21
+
22
+ - type: textarea
23
+ id: description
24
+ attributes:
25
+ label: Describe the problem you'd like to have solved
26
+ description: A clear and concise description of what the problem is.
27
+ placeholder: I'm always frustrated when...
28
+ validations:
29
+ required: true
30
+
31
+ - type: textarea
32
+ id: ideal-solution
33
+ attributes:
34
+ label: Describe the ideal solution
35
+ description: A clear and concise description of what you want to happen.
36
+ validations:
37
+ required: true
38
+
39
+ - type: textarea
40
+ id: alternatives-and-workarounds
41
+ attributes:
42
+ label: Alternatives and current workarounds
43
+ description: A clear and concise description of any alternatives you've considered or any workarounds that are currently in place.
44
+ validations:
45
+ required: false
46
+
47
+ - type: textarea
48
+ id: additional-context
49
+ attributes:
50
+ label: Additional context
51
+ description: Add any other context or screenshots about the feature request here.
52
+ validations:
53
+ required: false
@@ -1,7 +1,7 @@
1
1
  blank_issues_enabled: false
2
2
  contact_links:
3
3
  - name: Auth0 Community
4
- url: https://community.auth0.com/c/sdks/5
4
+ url: https://community.auth0.com
5
5
  about: Discuss this SDK in the Auth0 Community forums
6
6
  - name: SDK API Documentation
7
7
  url: https://www.rubydoc.info/gems/auth0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Change Log
2
2
 
3
+ ## [v5.14.0](https://github.com/auth0/ruby-auth0/tree/v5.14.0) (2023-07-13)
4
+ [Full Changelog](https://github.com/auth0/ruby-auth0/compare/v5.13.0...v5.14.0)
5
+
6
+ **Added**
7
+ - [SDK-4386] Support Organization Name in Authorize [\#495](https://github.com/auth0/ruby-auth0/pull/495) ([stevehobbsdev](https://github.com/stevehobbsdev))
8
+
3
9
  ## [v5.13.0](https://github.com/auth0/ruby-auth0/tree/v5.13.0) (2023-04-24)
4
10
  [Full Changelog](https://github.com/auth0/ruby-auth0/compare/v5.12.0...v5.13.0)
5
11
 
data/EXAMPLES.md CHANGED
@@ -85,7 +85,7 @@ Note that Organizations is currently only available to customers on our Enterpri
85
85
 
86
86
  ### Logging in with an Organization
87
87
 
88
- Configure the Authentication API client and pass your Organization ID to the authorize url:
88
+ Configure the Authentication API client and pass your Organization ID or name to the authorize url:
89
89
 
90
90
  ```ruby
91
91
  require 'auth0'
@@ -94,7 +94,7 @@ require 'auth0'
94
94
  client_id: '{YOUR_APPLICATION_CLIENT_ID}',
95
95
  client_secret: '{YOUR_APPLICATION_CLIENT_SECRET}',
96
96
  domain: '{YOUR_TENANT}.auth0.com',
97
- organization: "{YOUR_ORGANIZATION_ID}"
97
+ organization: "{YOUR_ORGANIZATION_ID_OR_NAME}"
98
98
  )
99
99
 
100
100
  universal_login_url = @auth0_client.authorization_url("https://{YOUR_APPLICATION_CALLBACK_URL}")
@@ -113,7 +113,7 @@ require 'auth0'
113
113
  client_id: '{YOUR_APPLICATION_CLIENT_ID}',
114
114
  client_secret: '{YOUR_APPLICATION_CLIENT_ID}',
115
115
  domain: '{YOUR_TENANT}.auth0.com',
116
- organization: "{YOUR_ORGANIZATION_ID}"
116
+ organization: "{YOUR_ORGANIZATION_ID_OR_NAME}"
117
117
  )
118
118
 
119
119
  universal_login_url = @auth0_client.authorization_url("https://{YOUR_APPLICATION_CALLBACK_URL}", {
@@ -148,7 +148,7 @@ The method takes the following optional keyword parameters:
148
148
  | `max_age` | Integer | The `max_age` value you sent in the call to `/authorize`, if any. | `nil` |
149
149
  | `issuer` | String | By default the `iss` claim will be checked against the URL of your **Auth0 Domain**. Use this parameter to override that. | `nil` |
150
150
  | `audience` | String | By default the `aud` claim will be compared to your **Auth0 Client ID**. Use this parameter to override that. | `nil` |
151
- | `organization` | String | By default the `org_id` claim will be compared to your **Organization ID**. Use this parameter to override that. | `nil` |
151
+ | `organization` | String | By default the `org_id` or `org_name` claims will be compared to the `organization` value specified at client creation. Use this parameter to override that. | `nil` |
152
152
 
153
153
  You can check the signing algorithm value under **Advanced Settings > OAuth > JsonWebToken Signature Algorithm** in your Auth0 application settings panel. [We recommend](https://auth0.com/docs/tokens/concepts/signing-algorithms#our-recommendation) that you make use of asymmetric signing algorithms like `RS256` instead of symmetric ones like `HS256`.
154
154
 
@@ -170,15 +170,17 @@ rescue Auth0::InvalidIdToken => e
170
170
  end
171
171
  ```
172
172
 
173
- ### Organization ID Token Validation
173
+ ### Organization claim validation
174
174
 
175
- If an org_id claim is present in the Access Token, then the claim should be validated by the API to ensure that the value received is expected or known.
175
+ If an `org_id` or `org_name` claim is present in the access token, then the claim should be validated by the API to ensure that the value received is expected or known.
176
176
 
177
177
  In particular:
178
178
 
179
179
  - The issuer (iss) claim should be checked to ensure the token was issued by Auth0
180
180
 
181
- - the org_id claim should be checked to ensure it is a value that is already known to the application. This could be validated against a known list of organization IDs, or perhaps checked in conjunction with the current request URL. e.g. the sub-domain may hint at what organization should be used to validate the Access Token.
181
+ - the `org_id` or `org_name` claim should be checked to ensure it is a value that is already known to the application. Which claim you check depends on the organization value being validated: if it starts with `org_`, validate against the `org_id` claim. Otherwise, validate against `org_name`. Further, `org_name` validation should be done using a **case-insensitive** check, whereas `org_id` should be an exact case-sensitive match.
182
+
183
+ This could be validated against a known list of organization IDs or names, or perhaps checked in conjunction with the current request URL. e.g. the sub-domain may hint at what organization should be used to validate the Access Token.
182
184
 
183
185
  Normally, validating the issuer would be enough to ensure that the token was issued by Auth0. In the case of organizations, additional checks should be made so that the organization within an Auth0 tenant is expected.
184
186
 
@@ -186,7 +188,7 @@ If the claim cannot be validated, then the application should deem the token inv
186
188
 
187
189
  ```ruby
188
190
  begin
189
- @auth0_client.validate_id_token 'YOUR_ID_TOKEN', organization: '{Expected org_id}'
191
+ @auth0_client.validate_id_token 'YOUR_ID_TOKEN', organization: '{Expected org_id or org_name}'
190
192
  rescue Auth0::InvalidIdToken => e
191
193
  # In this case the ID Token contents should not be trusted
192
194
  end
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- auth0 (5.13.0)
4
+ auth0 (5.14.0)
5
5
  addressable (~> 2.8)
6
- jwt (~> 2.5)
6
+ jwt (~> 2.7)
7
7
  rest-client (~> 2.1)
8
8
  retryable (~> 3.0)
9
9
  zache (~> 0.12)
@@ -11,20 +11,20 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- actionpack (7.0.4.3)
15
- actionview (= 7.0.4.3)
16
- activesupport (= 7.0.4.3)
17
- rack (~> 2.0, >= 2.2.0)
14
+ actionpack (7.0.6)
15
+ actionview (= 7.0.6)
16
+ activesupport (= 7.0.6)
17
+ rack (~> 2.0, >= 2.2.4)
18
18
  rack-test (>= 0.6.3)
19
19
  rails-dom-testing (~> 2.0)
20
20
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
21
- actionview (7.0.4.3)
22
- activesupport (= 7.0.4.3)
21
+ actionview (7.0.6)
22
+ activesupport (= 7.0.6)
23
23
  builder (~> 3.1)
24
24
  erubi (~> 1.4)
25
25
  rails-dom-testing (~> 2.0)
26
26
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
27
- activesupport (7.0.4.3)
27
+ activesupport (7.0.6)
28
28
  concurrent-ruby (~> 1.0, >= 1.0.2)
29
29
  i18n (>= 1.6, < 2)
30
30
  minitest (>= 5.1)
@@ -62,52 +62,56 @@ GEM
62
62
  http-accept (1.7.0)
63
63
  http-cookie (1.0.5)
64
64
  domain_name (~> 0.5)
65
- i18n (1.12.0)
65
+ i18n (1.14.1)
66
66
  concurrent-ruby (~> 1.0)
67
67
  io-console (0.6.0)
68
- irb (1.6.4)
69
- reline (>= 0.3.0)
68
+ irb (1.7.3)
69
+ reline (>= 0.3.6)
70
70
  json (2.6.3)
71
- jwt (2.7.0)
72
- loofah (2.20.0)
71
+ jwt (2.7.1)
72
+ language_server-protocol (3.17.0.3)
73
+ loofah (2.21.3)
73
74
  crass (~> 1.0.2)
74
- nokogiri (>= 1.5.9)
75
+ nokogiri (>= 1.12.0)
75
76
  method_source (1.0.0)
76
77
  mime-types (3.4.1)
77
78
  mime-types-data (~> 3.2015)
78
79
  mime-types-data (3.2023.0218.1)
79
- minitest (5.18.0)
80
+ minitest (5.18.1)
80
81
  multi_json (1.15.0)
81
82
  netrc (0.11.0)
82
- nokogiri (1.14.3-x86_64-linux)
83
+ nokogiri (1.15.3-x86_64-linux)
83
84
  racc (~> 1.4)
84
85
  parallel (1.23.0)
85
- parser (3.2.2.1)
86
+ parser (3.2.2.3)
86
87
  ast (~> 2.4.1)
88
+ racc
87
89
  pp (0.4.0)
88
90
  prettyprint
89
91
  prettyprint (0.1.1)
90
- public_suffix (5.0.1)
91
- racc (1.6.2)
92
- rack (2.2.6.4)
92
+ public_suffix (5.0.3)
93
+ racc (1.7.1)
94
+ rack (2.2.7)
93
95
  rack-test (0.8.3)
94
96
  rack (>= 1.0, < 3)
95
- rails-dom-testing (2.0.3)
96
- activesupport (>= 4.2.0)
97
+ rails-dom-testing (2.1.1)
98
+ activesupport (>= 5.0.0)
99
+ minitest
97
100
  nokogiri (>= 1.6)
98
- rails-html-sanitizer (1.5.0)
99
- loofah (~> 2.19, >= 2.19.1)
100
- railties (7.0.4.3)
101
- actionpack (= 7.0.4.3)
102
- activesupport (= 7.0.4.3)
101
+ rails-html-sanitizer (1.6.0)
102
+ loofah (~> 2.21)
103
+ nokogiri (~> 1.14)
104
+ railties (7.0.6)
105
+ actionpack (= 7.0.6)
106
+ activesupport (= 7.0.6)
103
107
  method_source
104
108
  rake (>= 12.2)
105
109
  thor (~> 1.0)
106
110
  zeitwerk (~> 2.5)
107
111
  rainbow (3.1.1)
108
112
  rake (13.0.6)
109
- regexp_parser (2.8.0)
110
- reline (0.3.3)
113
+ regexp_parser (2.8.1)
114
+ reline (0.3.6)
111
115
  io-console (~> 0.5)
112
116
  rest-client (2.1.0)
113
117
  http-accept (>= 1.7.0, < 2.0)
@@ -125,23 +129,24 @@ GEM
125
129
  rspec-expectations (3.12.3)
126
130
  diff-lcs (>= 1.2.0, < 2.0)
127
131
  rspec-support (~> 3.12.0)
128
- rspec-mocks (3.12.5)
132
+ rspec-mocks (3.12.6)
129
133
  diff-lcs (>= 1.2.0, < 2.0)
130
134
  rspec-support (~> 3.12.0)
131
- rspec-support (3.12.0)
132
- rubocop (1.50.2)
135
+ rspec-support (3.12.1)
136
+ rubocop (1.54.1)
133
137
  json (~> 2.3)
138
+ language_server-protocol (>= 3.17.0)
134
139
  parallel (~> 1.10)
135
- parser (>= 3.2.0.0)
140
+ parser (>= 3.2.2.3)
136
141
  rainbow (>= 2.2.2, < 4.0)
137
142
  regexp_parser (>= 1.8, < 3.0)
138
143
  rexml (>= 3.2.5, < 4.0)
139
144
  rubocop-ast (>= 1.28.0, < 2.0)
140
145
  ruby-progressbar (~> 1.7)
141
146
  unicode-display_width (>= 2.4.0, < 3.0)
142
- rubocop-ast (1.28.0)
147
+ rubocop-ast (1.29.0)
143
148
  parser (>= 3.2.1.0)
144
- rubocop-rails (2.19.1)
149
+ rubocop-rails (2.20.2)
145
150
  activesupport (>= 4.2.0)
146
151
  rack (>= 1.1)
147
152
  rubocop (>= 1.33.0, < 2.0)
@@ -158,7 +163,7 @@ GEM
158
163
  sync (0.5.0)
159
164
  term-ansicolor (1.7.1)
160
165
  tins (~> 1.0)
161
- thor (1.2.1)
166
+ thor (1.2.2)
162
167
  timecop (0.9.6)
163
168
  tins (1.32.1)
164
169
  sync
@@ -168,13 +173,13 @@ GEM
168
173
  unf_ext
169
174
  unf_ext (0.0.8.2)
170
175
  unicode-display_width (2.4.2)
171
- vcr (6.1.0)
176
+ vcr (6.2.0)
172
177
  webmock (3.18.1)
173
178
  addressable (>= 2.8.0)
174
179
  crack (>= 0.3.2)
175
180
  hashdiff (>= 0.4.0, < 2.0.0)
176
- zache (0.12.0)
177
- zeitwerk (2.6.7)
181
+ zache (0.13.0)
182
+ zeitwerk (2.6.8)
178
183
 
179
184
  PLATFORMS
180
185
  x86_64-linux
data/auth0.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = ['lib']
18
18
 
19
19
  s.add_runtime_dependency 'rest-client', '~> 2.1'
20
- s.add_runtime_dependency 'jwt', '~> 2.5'
20
+ s.add_runtime_dependency 'jwt', '~> 2.7'
21
21
  s.add_runtime_dependency 'zache', '~> 0.12'
22
22
  s.add_runtime_dependency 'addressable', '~> 2.8'
23
23
  s.add_runtime_dependency 'retryable', '~> 3.0'
@@ -188,13 +188,26 @@ module Auth0
188
188
  end
189
189
 
190
190
  def validate_org(claims, expected)
191
- unless claims.key?('org_id') && claims['org_id'].is_a?(String)
192
- raise Auth0::InvalidIdToken, 'Organization Id (org_id) claim must be a string present in the ID token'
193
- end
191
+ validate_as_id = expected.start_with? 'org_'
192
+
193
+ if validate_as_id
194
+ unless claims.key?('org_id') && claims['org_id'].is_a?(String)
195
+ raise Auth0::InvalidIdToken, 'Organization Id (org_id) claim must be a string present in the ID token'
196
+ end
194
197
 
195
- unless expected == claims['org_id']
196
- raise Auth0::InvalidIdToken, "Organization Id (org_id) claim value mismatch in the ID token; expected \"#{expected}\","\
197
- " found \"#{claims['org_id']}\""
198
+ unless expected == claims['org_id']
199
+ raise Auth0::InvalidIdToken, "Organization Id (org_id) claim value mismatch in the ID token; expected \"#{expected}\","\
200
+ " found \"#{claims['org_id']}\""
201
+ end
202
+ else
203
+ unless claims.key?('org_name') && claims['org_name'].is_a?(String)
204
+ raise Auth0::InvalidIdToken, 'Organization Name (org_name) claim must be a string present in the ID token'
205
+ end
206
+
207
+ unless expected.downcase == claims['org_name'].downcase
208
+ raise Auth0::InvalidIdToken, "Organization Name (org_name) claim value mismatch in the ID token; expected \"#{expected}\","\
209
+ " found \"#{claims['org_name']}\""
210
+ end
198
211
  end
199
212
  end
200
213
 
data/lib/auth0/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # current version of gem
2
2
  module Auth0
3
- VERSION = '5.13.0'.freeze
3
+ VERSION = '5.14.0'.freeze
4
4
  end
@@ -1,5 +1,6 @@
1
1
  # rubocop:disable Metrics/BlockLength
2
2
  require 'spec_helper'
3
+ require 'jwt'
3
4
 
4
5
  RSA_PUB_KEY_JWK_1 = { 'kty': "RSA", 'use': 'sig', 'n': "uGbXWiK3dQTyCbX5xdE4yCuYp0AF2d15Qq1JSXT_lx8CEcXb9RbDddl8jGDv-spi5qPa8qEHiK7FwV2KpRE983wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVsWXI9C-yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT69s7of9-I9l5lsJ9cozf1rxrXX4V1u_SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8AziMCxS-VrRPDM-zfvpIJg3JljAh3PJHDiLu902v9w-Iplu1WyoB2aPfitxEhRN0Yw", 'e': 'AQAB', 'kid': 'test-key-1' }.freeze
5
6
  RSA_PUB_KEY_JWK_2 = { 'kty': "RSA", 'use': 'sig', 'n': "uGbXWiK3dQTyCbX5xdE4yCuYp0AF2d15Qq1JSXT_lx8CEcXb9RbDddl8jGDv-spi5qPa8qEHiK7FwV2KpRE983wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVsWXI9C-yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT69s7of9-I9l5lsJ9cozf1rxrXX4V1u_SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8AziMCxS-VrRPDM-zfvpIJg3JljAh3PJHDiLu902v9w-Iplu1WyoB2aPfitxEhRN0Yw", 'e': 'AQAB', 'kid': 'test-key-2' }.freeze
@@ -13,8 +14,14 @@ LEEWAY = 60
13
14
  CLOCK = 1587592561 # Apr 22 2020 21:56:01 UTC
14
15
  CONTEXT = { algorithm: Auth0::Algorithm::HS256.secret(HMAC_SHARED_SECRET), leeway: LEEWAY, audience: 'tokens-test-123', issuer: 'https://tokens-test.auth0.com/', clock: CLOCK }.freeze
15
16
 
17
+ def build_id_token(payload = {})
18
+ default_payload = { iss: CONTEXT[:issuer], sub: 'user123', aud: CONTEXT[:audience], exp: CLOCK, iat: CLOCK }
19
+ JWT.encode(default_payload.merge(payload), HMAC_SHARED_SECRET, 'HS256')
20
+ end
21
+
16
22
  describe Auth0::Mixins::Validation::IdTokenValidator do
17
23
  subject { @instance }
24
+ let (:minimal_id_token) { build_id_token }
18
25
 
19
26
  context 'instance' do
20
27
  it 'is expected respond to :validate' do
@@ -285,30 +292,73 @@ describe Auth0::Mixins::Validation::IdTokenValidator do
285
292
  expect { instance.validate(token) }.to raise_exception("Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time \"#{clock}\" is after last auth at \"#{auth_time}\"")
286
293
  end
287
294
 
288
- it 'is expected not to raise an error when org_id exsist in the token, but not required' do
289
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE3ODgxLCJpYXQiOjE2MTY0NDUwODEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTQ4MSwib3JnX2lkIjoidGVzdE9yZyJ9.AOafUKUNgaxUXpSRYFCeJERcwrQZ4q2NZlutwGXnh9I'
290
- expect { @instance.validate(token) }.not_to raise_exception
291
- end
295
+ context 'Organization claims validation' do
296
+ it 'is expected not to raise an error when org_id exsist in the token, but not required' do
297
+ token = build_id_token org_id: 'org_123'
298
+ expect { @instance.validate(token) }.not_to raise_exception
299
+ end
292
300
 
293
- it 'is expected to raise an error with a missing but required organization' do
294
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE4MTg1LCJpYXQiOjE2MTY0NDUzODUsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTc4NX0.UMo5pmgceXO9lIKzbk7X0ZhE5DOe0IP2LfMKdUj03zQ'
295
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'a1b2c3d4e5' }))
301
+ it 'is expected not to raise an error when org_name exists in the token, but not required' do
302
+ token = build_id_token org_name: 'my-organization'
303
+ expect { @instance.validate(token) }.not_to raise_exception
304
+ end
296
305
 
297
- expect { instance.validate(token) }.to raise_exception('Organization Id (org_id) claim must be a string present in the ID token')
298
- end
306
+ it 'is expected to raise an error with a missing but required organization ID' do
307
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_1234' }))
308
+ expect { instance.validate(minimal_id_token) }.to raise_exception('Organization Id (org_id) claim must be a string present in the ID token')
309
+ end
299
310
 
300
- it 'is expected to raise an error with an invalid organization' do
301
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE3ODgxLCJpYXQiOjE2MTY0NDUwODEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTQ4MSwib3JnX2lkIjoidGVzdE9yZyJ9.AOafUKUNgaxUXpSRYFCeJERcwrQZ4q2NZlutwGXnh9I'
302
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'a1b2c3d4e5' }))
311
+ it 'is expected to raise an error with a missing but required organization name' do
312
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
313
+ expect { instance.validate(minimal_id_token) }.to raise_exception('Organization Name (org_name) claim must be a string present in the ID token')
314
+ end
303
315
 
304
- expect { instance.validate(token) }.to raise_exception('Organization Id (org_id) claim value mismatch in the ID token; expected "a1b2c3d4e5", found "testOrg"')
305
- end
316
+ it 'is expected to raise an error with an invalid organization ID' do
317
+ token = build_id_token org_id: 'org_1234'
318
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_5678' }))
319
+
320
+ expect { instance.validate(token) }.to raise_exception('Organization Id (org_id) claim value mismatch in the ID token; expected "org_5678", found "org_1234"')
321
+ end
322
+
323
+ it 'is expected to raise an error with an invalid organization name' do
324
+ token = build_id_token org_name: 'another-organization'
325
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
326
+
327
+ expect { instance.validate(token) }.to raise_exception('Organization Name (org_name) claim value mismatch in the ID token; expected "my-organization", found "another-organization"')
328
+ end
329
+
330
+ it 'is expected to NOT raise an error with a valid organization ID' do
331
+ token = build_id_token org_id: 'org_1234'
332
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_1234' }))
333
+
334
+ expect { instance.validate(token) }.not_to raise_exception
335
+ end
336
+
337
+ it 'is expected to NOT raise an error with a valid organization name' do
338
+ token = build_id_token org_name: 'my-organization'
339
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
340
+
341
+ expect { instance.validate(token) }.not_to raise_exception
342
+ end
343
+
344
+ it 'is expected to NOT raise an error with organization name in different casing' do
345
+ token = build_id_token org_name: 'MY-ORGANIZATION'
346
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
347
+
348
+ expect { instance.validate(token) }.not_to raise_exception
349
+ end
306
350
 
307
- it 'is expected to NOT raise an error with a valid organization' do
308
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE3ODgxLCJpYXQiOjE2MTY0NDUwODEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTQ4MSwib3JnX2lkIjoidGVzdE9yZyJ9.AOafUKUNgaxUXpSRYFCeJERcwrQZ4q2NZlutwGXnh9I'
309
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'testOrg' }))
351
+ it 'validates org_id when both claims are present in the token' do
352
+ token = build_id_token org_name: 'my-organization', org_id: 'org_1234'
353
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_1234' }))
354
+ expect { instance.validate(token) }.not_to raise_exception
355
+ end
310
356
 
311
- expect { instance.validate(token) }.not_to raise_exception
357
+ it 'validates org_name when both claims are present in the token' do
358
+ token = build_id_token org_name: 'my-organization', org_id: 'org_1234'
359
+ instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
360
+ expect { instance.validate(token) }.not_to raise_exception
361
+ end
312
362
  end
313
363
  end
314
364
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auth0
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.13.0
4
+ version: 5.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Auth0
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-04-24 00:00:00.000000000 Z
14
+ date: 2023-07-13 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rest-client
@@ -33,14 +33,14 @@ dependencies:
33
33
  requirements:
34
34
  - - "~>"
35
35
  - !ruby/object:Gem::Version
36
- version: '2.5'
36
+ version: '2.7'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '2.5'
43
+ version: '2.7'
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: zache
46
46
  requirement: !ruby/object:Gem::Requirement
@@ -237,9 +237,9 @@ files:
237
237
  - ".env.example"
238
238
  - ".gemrelease"
239
239
  - ".github/CODEOWNERS"
240
+ - ".github/ISSUE_TEMPLATE/Bug Report.yml"
241
+ - ".github/ISSUE_TEMPLATE/Feature Request.yml"
240
242
  - ".github/ISSUE_TEMPLATE/config.yml"
241
- - ".github/ISSUE_TEMPLATE/feature_request.md"
242
- - ".github/ISSUE_TEMPLATE/report_a_bug.md"
243
243
  - ".github/PULL_REQUEST_TEMPLATE.md"
244
244
  - ".github/dependabot.yml"
245
245
  - ".github/stale.yml"
@@ -1,39 +0,0 @@
1
- ---
2
- name: Feature request
3
- about: Suggest an idea or a feature for this project
4
- title: ''
5
- labels: feature request
6
- assignees: ''
7
- ---
8
-
9
- <!--
10
- **Please do not report security vulnerabilities here**. The Responsible Disclosure Program (https://auth0.com/whitehat) details the procedure for disclosing security issues.
11
-
12
- Thank you in advance for helping us to improve this library! Your attention to detail here is greatly appreciated and will help us respond as quickly as possible. For general support or usage questions, use the Auth0 Community (https://community.auth0.com/) or Auth0 Support (https://support.auth0.com/). Finally, to avoid duplicates, please search existing Issues before submitting one here.
13
-
14
- By submitting an Issue to this repository, you agree to the terms within the Auth0 Code of Conduct (https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
15
- -->
16
-
17
- ### Describe the problem you'd like to have solved
18
-
19
- <!--
20
- > A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
21
- -->
22
-
23
- ### Describe the ideal solution
24
-
25
- <!--
26
- > A clear and concise description of what you want to happen.
27
- -->
28
-
29
- ## Alternatives and current work-arounds
30
-
31
- <!--
32
- > A clear and concise description of any alternatives you've considered or any work-arounds that are currently in place.
33
- -->
34
-
35
- ### Additional information, if any
36
-
37
- <!--
38
- > Add any other context or screenshots about the feature request here.
39
- -->
@@ -1,55 +0,0 @@
1
- ---
2
- name: Report a bug
3
- about: Have you found a bug or issue? Create a bug report for this SDK
4
- title: ''
5
- labels: bug report
6
- assignees: ''
7
- ---
8
-
9
- <!--
10
- **Please do not report security vulnerabilities here**. The Responsible Disclosure Program (https://auth0.com/whitehat) details the procedure for disclosing security issues.
11
-
12
- Thank you in advance for helping us to improve this library! Please read through the template below and answer all relevant questions. Your additional work here is greatly appreciated and will help us respond as quickly as possible. For general support or usage questions, use the Auth0 Community (https://community.auth0.com/) or Auth0 Support (https://support.auth0.com/). Finally, to avoid duplicates, please search existing Issues before submitting one here.
13
-
14
- By submitting an Issue to this repository, you agree to the terms within the Auth0 Code of Conduct (https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
15
- -->
16
-
17
- ### Describe the problem
18
-
19
- <!--
20
- > Provide a clear and concise description of the issue
21
- -->
22
-
23
- ### What was the expected behavior?
24
-
25
- <!--
26
- > Tell us about the behavior you expected to see
27
- -->
28
-
29
- ### Reproduction
30
- <!--
31
- > Detail the steps taken to reproduce this error, and whether this issue can be reproduced consistently or if it is intermittent.
32
- > **Note**: If clear, reproducable steps or the smallest sample app demonstrating misbehavior cannot be provided, we may not be able to follow up on this bug report.
33
-
34
- > Where possible, please include:
35
- >
36
- > - The smallest possible sample app that reproduces the undesirable behavior
37
- > - Log files (redact/remove sensitive information)
38
- > - Application settings (redact/remove sensitive information)
39
- > - Screenshots
40
- -->
41
-
42
- - Step 1..
43
- - Step 2..
44
- - ...
45
-
46
- ### Environment
47
-
48
- <!--
49
- > Please provide the following:
50
- -->
51
-
52
- - **Version of this library used:**
53
- - **Which framework are you using, if applicable:**
54
- - **Other modules/plugins/libraries that might be involved:**
55
- - **Any other relevant information you think would be useful:**