omniauth-microsoft_graph 2.0.0 → 2.0.1
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d89d349bdaa2e7c2d75edf01ef55baa73fb647ec0ce79a6542ad946e84f6cfe4
|
4
|
+
data.tar.gz: 7d1f758e047e86b318f8d71007d3ba5735b771a1075726c49b8a2e95bc7cbdff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afdcf7236c17dc9a213c64a44b7dc8a81e6ee46bd34696ad3889ef9207066eb46b51a8efe5cf88612975356d8d126b24714f0f0bdf8a4e3fad216eeb26b34b8c
|
7
|
+
data.tar.gz: a6f547877dacd8c7dbfcd1f8299a2fc432de9b1712b2bf74f8ae50326c360b524a790f1b63a1f9803795b51c49ff88ac9e4d2f94572454482dc4972f39334a35
|
data/.github/workflows/ruby.yml
CHANGED
@@ -8,24 +8,23 @@
|
|
8
8
|
name: Ruby
|
9
9
|
|
10
10
|
on:
|
11
|
-
push:
|
12
11
|
pull_request:
|
13
12
|
|
14
13
|
jobs:
|
15
14
|
test:
|
16
15
|
|
17
|
-
runs-on: ubuntu-latest
|
18
16
|
strategy:
|
19
17
|
matrix:
|
20
|
-
|
18
|
+
os: [ubuntu-latest, macos-latest]
|
19
|
+
ruby-version: ['3.0', '3.1', '3.2', '3.3']
|
20
|
+
runs-on: ${{ matrix.os }}
|
21
21
|
|
22
22
|
steps:
|
23
23
|
- uses: actions/checkout@v2
|
24
24
|
- name: Set up Ruby
|
25
25
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
26
26
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
27
|
-
|
28
|
-
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
27
|
+
uses: ruby/setup-ruby@v1
|
29
28
|
with:
|
30
29
|
ruby-version: ${{ matrix.ruby-version }}
|
31
30
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
@@ -9,6 +9,7 @@ module OmniAuth
|
|
9
9
|
# https://www.descope.com/blog/post/noauth
|
10
10
|
# https://clerk.com/docs/authentication/social-connections/microsoft#stay-secure-against-the-n-o-auth-vulnerability
|
11
11
|
OIDC_CONFIG_URL = 'https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration'
|
12
|
+
COMMON_JWKS_URL = 'https://login.microsoftonline.com/common/discovery/v2.0/keys'
|
12
13
|
|
13
14
|
class DomainVerificationError < OmniAuth::Error; end
|
14
15
|
|
@@ -62,13 +63,25 @@ module OmniAuth
|
|
62
63
|
def domain_verified_jwt_claim
|
63
64
|
oidc_config = access_token.get(OIDC_CONFIG_URL).parsed
|
64
65
|
algorithms = oidc_config['id_token_signing_alg_values_supported']
|
65
|
-
|
66
|
-
decoded_token = JWT.decode(id_token, nil, true, algorithms: algorithms, jwks:
|
66
|
+
jwks = get_jwks(oidc_config)
|
67
|
+
decoded_token = JWT.decode(id_token, nil, true, algorithms: algorithms, jwks: jwks)
|
68
|
+
xms_edov_valid?(decoded_token)
|
69
|
+
rescue JWT::VerificationError, ::OAuth2::Error
|
70
|
+
false
|
71
|
+
end
|
72
|
+
|
73
|
+
def xms_edov_valid?(decoded_token)
|
67
74
|
# https://github.com/MicrosoftDocs/azure-docs/issues/111425#issuecomment-1761043378
|
68
75
|
# Comments seemed to indicate the value is not consistent
|
69
76
|
['1', 1, 'true', true].include?(decoded_token.first['xms_edov'])
|
70
|
-
|
71
|
-
|
77
|
+
end
|
78
|
+
|
79
|
+
def get_jwks(oidc_config)
|
80
|
+
# Depending on the tenant, the JWKS endpoint might be different. We need to
|
81
|
+
# consider both the JWKS from the OIDC configuration and the common JWKS endpoint.
|
82
|
+
oidc_config_jwk_keys = access_token.get(oidc_config['jwks_uri']).parsed[:keys]
|
83
|
+
common_jwk_keys = access_token.get(COMMON_JWKS_URL).parsed[:keys]
|
84
|
+
JWT::JWK::Set.new(oidc_config_jwk_keys + common_jwk_keys)
|
72
85
|
end
|
73
86
|
|
74
87
|
def verification_error_message
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_runtime_dependency 'jwt', '~> 2.0'
|
22
22
|
spec.add_runtime_dependency 'omniauth', '~> 2.0'
|
23
23
|
spec.add_runtime_dependency 'omniauth-oauth2', '~> 1.8.0'
|
24
|
-
spec.add_development_dependency "sinatra", '~>
|
24
|
+
spec.add_development_dependency "sinatra", '~> 2.2'
|
25
25
|
spec.add_development_dependency "rake", '~> 12.3.3', '>= 12.3.3'
|
26
26
|
spec.add_development_dependency 'rspec', '~> 3.6'
|
27
27
|
spec.add_development_dependency "mocha", '~> 0'
|
@@ -41,34 +41,65 @@ RSpec.describe OmniAuth::MicrosoftGraph::DomainVerifier do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
context 'when the ID token indicates domain verification' do
|
44
|
-
|
45
|
-
|
46
|
-
optional_parameters = { kid: 'mock-kid', use: 'sig', alg: 'RS256' }
|
44
|
+
let(:mock_oidc_key) do
|
45
|
+
optional_parameters = { kid: 'mock_oidc_key', use: 'sig', alg: 'RS256' }
|
47
46
|
JWT::JWK.new(OpenSSL::PKey::RSA.new(2048), optional_parameters)
|
48
47
|
end
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
|
49
|
+
let(:mock_common_key) do
|
50
|
+
optional_parameters = { kid: 'mock_common_key', use: 'sig', alg: 'RS256' }
|
51
|
+
JWT::JWK.new(OpenSSL::PKey::RSA.new(2048), optional_parameters)
|
52
52
|
end
|
53
53
|
|
54
|
-
# Mock the API responses to return the
|
54
|
+
# Mock the API responses to return the mock keys
|
55
55
|
before do
|
56
56
|
allow(access_token).to receive(:get)
|
57
57
|
.with(OmniAuth::MicrosoftGraph::OIDC_CONFIG_URL)
|
58
58
|
.and_return(
|
59
|
-
double(
|
60
|
-
'
|
61
|
-
|
62
|
-
|
59
|
+
double(
|
60
|
+
'OAuth2::Response',
|
61
|
+
parsed: {
|
62
|
+
'id_token_signing_alg_values_supported' => ['RS256'],
|
63
|
+
'jwks_uri' => 'https://example.com/jwks-keys',
|
64
|
+
}
|
65
|
+
)
|
63
66
|
)
|
64
67
|
allow(access_token).to receive(:get)
|
65
68
|
.with('https://example.com/jwks-keys')
|
66
69
|
.and_return(
|
67
|
-
double(
|
70
|
+
double(
|
71
|
+
'OAuth2::Response',
|
72
|
+
parsed: JWT::JWK::Set.new(mock_oidc_key).export
|
73
|
+
)
|
74
|
+
)
|
75
|
+
allow(access_token).to receive(:get)
|
76
|
+
.with(OmniAuth::MicrosoftGraph::COMMON_JWKS_URL)
|
77
|
+
.and_return(
|
78
|
+
double(
|
79
|
+
'OAuth2::Response',
|
80
|
+
parsed: JWT::JWK::Set.new(mock_common_key).export,
|
81
|
+
body: JWT::JWK::Set.new(mock_common_key).export.to_json
|
82
|
+
)
|
68
83
|
)
|
69
84
|
end
|
70
85
|
|
71
|
-
|
86
|
+
context 'when the kid exists in the oidc key' do
|
87
|
+
let(:id_token) do
|
88
|
+
payload = { email: email, xms_edov: true }
|
89
|
+
JWT.encode(payload, mock_oidc_key.signing_key, mock_oidc_key[:alg], kid: mock_oidc_key[:kid])
|
90
|
+
end
|
91
|
+
|
92
|
+
it { is_expected.to be_truthy }
|
93
|
+
end
|
94
|
+
|
95
|
+
context "when the kid exists in the common key" do
|
96
|
+
let(:id_token) do
|
97
|
+
payload = { email: email, xms_edov: true }
|
98
|
+
JWT.encode(payload, mock_common_key.signing_key, mock_common_key[:alg], kid: mock_common_key[:kid])
|
99
|
+
end
|
100
|
+
|
101
|
+
it { is_expected.to be_truthy }
|
102
|
+
end
|
72
103
|
end
|
73
104
|
|
74
105
|
context 'when all verification strategies fail' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth-microsoft_graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Philips
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-06-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: jwt
|
@@ -59,14 +59,14 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '2.2'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
69
|
+
version: '2.2'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rake
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
160
|
- !ruby/object:Gem::Version
|
161
161
|
version: '0'
|
162
162
|
requirements: []
|
163
|
-
rubygems_version: 3.
|
163
|
+
rubygems_version: 3.3.26
|
164
164
|
signing_key:
|
165
165
|
specification_version: 4
|
166
166
|
summary: omniauth provider for Microsoft Graph
|