Skip to content

Commit 074ea67

Browse files
authored
Merge pull request #111 from jinnatar/sign-algo-verify
Update OIDC id_token_signing_alg_values_supported for wider algo support
2 parents 313777e + c06902e commit 074ea67

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

src/idpyoidc/message/oidc/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -942,8 +942,14 @@ def verify(self, **kwargs):
942942
"token_endpoint_auth_signing_alg_values_supported"
943943
)
944944

945-
if "RS256" not in self["id_token_signing_alg_values_supported"]:
946-
raise ValueError("RS256 missing from id_token_signing_alg_values_supported")
945+
# Check that any alg that is not "none" is supported.
946+
# While OpenID Connect Core 1.0 says RS256 MUST be supported,
947+
# reality has moved on and more modern alg values may be required.
948+
if not any(i.lower() != "none" for i in self["id_token_signing_alg_values_supported"]):
949+
raise ValueError(
950+
"Secure signing algorithm (for example RS256 or ES256) missing from id_token_signing_alg_values_supported: %s"
951+
% self["id_token_signing_alg_values_supported"]
952+
)
947953

948954
if not parts.query and not parts.fragment:
949955
pass

tests/test_06_oidc.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ def test_example_response(self):
470470
[
471471
"issuer",
472472
"authorization_endpoint",
473+
"token_endpoint",
473474
"jwks_uri",
474475
"response_types_supported",
475476
"subject_types_supported",
@@ -480,6 +481,7 @@ def test_required_parameters(self, required_param):
480481
provider_config = {
481482
"issuer": "https://server.example.com",
482483
"authorization_endpoint": "https://server.example.com/connect/authorize",
484+
"token_endpoint": "https://server.example.com/connect/token",
483485
"jwks_uri": "https://server.example.com/jwks.json",
484486
"response_types_supported": ["code", "code id_token", "id_token", "token id_token"],
485487
"subject_types_supported": ["public", "pairwise"],
@@ -516,6 +518,33 @@ def test_token_endpoint_is_required_for_other_than_implicit_flow_only(self):
516518
with pytest.raises(MissingRequiredAttribute):
517519
ProviderConfigurationResponse(**provider_config).verify()
518520

521+
def test_required_parameters_without_rs256(self):
522+
provider_config = {
523+
"issuer": "https://server.example.com",
524+
"authorization_endpoint": "https://server.example.com/connect/authorize",
525+
"token_endpoint": "https://server.example.com/connect/token",
526+
"jwks_uri": "https://server.example.com/jwks.json",
527+
"response_types_supported": ["code", "code id_token", "id_token", "token id_token"],
528+
"subject_types_supported": ["public", "pairwise"],
529+
"id_token_signing_alg_values_supported": ["none", "ES256", "HS256"],
530+
}
531+
532+
assert ProviderConfigurationResponse(**provider_config).verify()
533+
534+
def test_required_parameters_only_none_signing_alg(self):
535+
provider_config = {
536+
"issuer": "https://server.example.com",
537+
"authorization_endpoint": "https://server.example.com/connect/authorize",
538+
"token_endpoint": "https://server.example.com/connect/token",
539+
"jwks_uri": "https://server.example.com/jwks.json",
540+
"response_types_supported": ["code", "code id_token", "id_token", "token id_token"],
541+
"subject_types_supported": ["public", "pairwise"],
542+
"id_token_signing_alg_values_supported": ["none"],
543+
}
544+
545+
with pytest.raises(ValueError):
546+
ProviderConfigurationResponse(**provider_config).verify()
547+
519548

520549
class TestRegistrationRequest(object):
521550
def test_deserialize(self):

0 commit comments

Comments
 (0)