| A | B | C | D | E | F | G | H | |
|---|---|---|---|---|---|---|---|---|
1 | Conformance Feature Information | OP Conformance Profiles | ||||||
2 | Feature Name | Conformance Test Name | Test ID | Basis | Implicit | Hybrid | Config | Dynamic |
3 | Response Type & Response Mode | |||||||
4 | Support code response_type | Request with response_type=code | OP-Response-code | y | ||||
5 | Support id_token response_type | Request with response_type=id_token | OP-Response-id_token | y | ||||
6 | Support id_token token response_type | Request with response_type=id_token token | OP-Response-id_token+token | y | ||||
7 | Support code id_token response_type | Request with response_type=code id_token | OP-Response-code+id_token | y | ||||
8 | Support code token response_type | Request with response_type=code token | OP-Response-code+token | y | ||||
9 | Support code id_token token response_type | Request with response_type=code id_token token | OP-Response-code+id_token+token | y | ||||
10 | Reject request without response_type | Authorization request missing the response_type parameter | OP-Response-Missing | y | y | y | ||
11 | ID Token | |||||||
12 | ID Token has iss claim | IdToken.verify() | y | y | y | |||
13 | ID Token has sub claim | IdToken.verify() | y | y | y | |||
14 | ID Token has aud claim | IdToken.verify() | y | y | y | |||
15 | ID Token has iat claim | IdToken.verify() | y | y | y | |||
16 | Does the OP sign the ID Token and with what | Does the OP sign the ID Token and with what | OP-IDToken-Signature | y | y | y | ||
17 | Asymmetric ID Token signature with RS256 | Asymmetric ID Token signature with RS256 | OP-IDToken-RS256 | y | ||||
18 | ID Token has kid claim | IDToken has kid | OP-IDToken-kid | y | y | y | ||
19 | Unsecured ID Token signature with none | Unsecured ID Token signature with none | OP-IDToken-none | y if uses none | y if uses none | y if uses none | ||
20 | ID Token has at_hash when ID Token and Access Token returned from Authorization Endpoint | ID Token has at_hash when ID Token and Access Token returned from Authorization Endpoint | OP-IDToken-at_hash | y | y | |||
21 | ID Token has c_hash when ID Token and Authorization Code returned from Authorization Endpoint | ID Token has c_hash when ID Token and Authorization Code returned from Authorization Endpoint | OP-IDToken-c_hash | y | ||||
22 | UserInfo Endpoint | |||||||
23 | Has UserInfo Endpoint | UserInfo Endpoint access with GET and bearer header | OP-UserInfo-Endpoint | y | y | y | ||
24 | UserInfo Endpoint access with header method | UserInfo Endpoint access with POST and bearer header | OP-UserInfo-Header | y | y | y | ||
25 | UserInfo Endpoint access with form-encoded body method | UserInfo Endpoint access with POST and bearer body | OP-UserInfo-Body | Warning if broken | Warning if broken | Warning if broken | ||
26 | UserInfo has sub claim | OpenIDSchema.verify() | y | y | y | |||
27 | Can provide signed UserInfo response with RS256 | RP registers userinfo_signed_response_alg to signal that it wants signed UserInfo returned | OP-UserInfo-RS256 | y | ||||
28 | nonce Request Parameter | |||||||
29 | Support requests without nonce when using the code flow | Login no nonce, code flow | OP-nonce-NoReq-code | y | ||||
30 | Reject requests without nonce unless using the code flow | Reject requests without nonce unless using the code flow | OP-nonce-NoReq-noncode | y | y | |||
31 | ID Token has nonce when requested for code flow | ID Token has nonce when requested for code flow | OP-nonce-code | y | ||||
32 | ID Token has nonce when requested for non-code flows | Request with nonce, verifies it was returned in ID Token | OP-nonce-noncode | y | y | |||
33 | scope Request Parameter | |||||||
34 | Support openid scope | Does the OP sign the ID Token and with what | OP-IDToken-Signature | no err | no err | no err | ||
35 | Support profile scope | Scope requesting profile claims | OP-scope-profile | no err | no err | no err | ||
36 | Support email scope | Scope requesting email claims | OP-scope-email | no err | no err | no err | ||
37 | Support address scope | Scope requesting address claims | OP-scope-address | no err | no err | no err | ||
38 | Support phone scope | Scope requesting phone claims | OP-scope-phone | no err | no err | no err | ||
39 | Support scope value requesting all basic claims | Scope requesting all claims | OP-scope-All | no err | no err | no err | ||
40 | display Request Parameter | |||||||
41 | Support display value page | Request with display=page | OP-display-page | no err | no err | no err | ||
42 | Support display value popup | Request with display=popup | OP-display-popup | no err | no err | no err | ||
43 | prompt Request Parameter | |||||||
44 | Support prompt value login | Request with prompt=login | OP-prompt-login | y | y | y | ||
45 | Support prompt value none | Request with prompt=none when not logged in | OP-prompt-none-NotLoggedIn | y | y | y | ||
46 | Support prompt value none | Request with prompt=none when logged in | OP-prompt-none-LoggedIn | y | y | y | ||
47 | Misc Request Parameters | |||||||
48 | Support max_age request parameter | Requesting ID Token with max_age=1 seconds restriction | OP-Req-max_age=1 | y | y | y | ||
49 | ID Token has auth_time claim when max_age in request | Requesting ID Token with max_age=1 seconds restriction | OP-Req-max_age=1 | y | y | y | ||
50 | Support max_age request parameter when max age reached | Requesting ID Token with max_age=1 seconds restriction | OP-Req-max_age=1 | Warning if no prompt | Warning if no prompt | Warning if no prompt | ||
51 | Support max_age request parameter when max age not reached | Requesting ID Token with max_age=10000 seconds restriction | OP-Req-max_age=10000 | y | y | y | ||
52 | Ignores not understood query parameter in Authentication Request | Request with extra query component | OP-Req-NotUnderstood | y | y | y | ||
53 | Support id_token_hint request parameter | Using prompt=none with user hint through id_token_hint | OP-Req-id_token_hint | SHOULD | SHOULD | SHOULD | ||
54 | Support login_hint request parameter | Providing login_hint | OP-Req-login_hint | no err | no err | no err | ||
55 | Support ui_locales request parameter | Providing ui_locales | OP-Req-ui_locales | no err | no err | no err | ||
56 | Support claims_locales request parameter | Providing claims_locales | OP-Req-claims_locales | no err | no err | no err | ||
57 | Support acr_values request parameter | Providing acr_values | OP-Req-acr_values | no err | no err | no err | ||
58 | OAuth Behaviors | |||||||
59 | OAuth state request value returned in response | VerifyState() | y | y | y | |||
60 | Reject second use of Authorization Code | Trying to use authorization code twice should result in an error | OP-OAuth-2nd | Warning if under 30s | Warning if under 30s | |||
61 | Reject second use of Authorization Code after 30 seconds | Trying to use authorization code twice with 30 seconds in between must result in an error | OP-OAuth-2nd-30s | OAuth MUST | OAuth MUST | |||
62 | Second use of Authorization Code revokes previously issued Access Token | Trying to use authorization code twice should result in revoking previously issued access tokens | OP-OAuth-2nd-Revokes | OAuth SHOULD | OAuth SHOULD | |||
63 | Reject second use of Authorization Code | Trying to use authorization code twice with 30 seconds in between must result in an error | OP-OAuth-2nd-30s | OAuth MUST | OAuth MUST | |||
64 | redirect_uri | |||||||
65 | Reject redirect_uri not matching a registered redirect_uri | Sent redirect_uri does not match a registered redirect_uri | OP-redirect_uri-NotReg | y | y | y | ||
66 | Reject request without redirect_uri when multiple registered | Reject request without redirect_uri when multiple registered | OP-redirect_uri-Missing | y | ||||
67 | Preserves query parameter in redirect_uri | Request with a redirect_uri with a query component when a redirect_uri with the same query component is registered | OP-redirect_uri-Query-OK | y | ||||
68 | Preserves query parameter in registered redirect_uris | Request with a redirect_uri with a query component when a redirect_uri with the same query component is registered | OP-redirect_uri-Query-OK | y | ||||
69 | Reject redirect_uri when query parameter does not match | Rejects redirect_uri when query parameter does not match what is registed | OP-redirect_uri-Query-Mismatch | y | ||||
70 | Reject redirect_uri when query parameter added | Request with redirect_uri with query component when registered redirect_uri has no query component | OP-redirect_uri-Query-Added | y | ||||
71 | Reject registration of redirect_uris with fragment | Registration where a redirect_uri has a fragment | OP-redirect_uri-RegFrag | y | ||||
72 | Client Authentication | |||||||
73 | Support client authentication to Token Endpoint using HTTP Basic with POST | Access token request with client_secret_basic authentication | OP-ClientAuth-Basic-Dynamic | y | y | |||
74 | (same as above) | Access token request with client_secret_basic authentication | OP-ClientAuth-Basic-Static | y | y | |||
75 | Support client authentication to Token Endpoint using form-encoded client credentials in POST body | Access token request with client_secret_post authentication | OP-ClientAuth-SecretPost-Dynamic | y | y | |||
76 | (same as above) | Access token request with client_secret_post authentication | OP-ClientAuth-SecretPost-Static | y | y | |||
77 | Discovery | |||||||
78 | Publishes openid-configuration discovery information | Publishes openid-configuration discovery information | OP-Discovery-Config | y | y | |||
79 | Config has issuer | ProviderConfigurationResponse.verify() | y | y | ||||
80 | Discovered issuer matches openid-configuration path prefix | ProviderConfigurationResponse.verify() | y | y | ||||
81 | Discovered issuer matches ID Token iss value | IdToken.verify() | y | y | ||||
82 | Config has authorization_endpoint | CheckEndpoint() | y | y | ||||
83 | Config has token_endpoint | CheckEndpoint() | y unless only Implicit | y | ||||
84 | Config has userinfo_endpoint | CheckEndpoint() | y unless self-issued | y | ||||
85 | Config has jwks_uri | Verify that jwks_uri is published | OP-Discovery-jwks_uri | y unless only none | y | |||
86 | Keys in OP JWKs well formed | Keys in OP JWKs well formed | OP-Discovery-JWKs | y unless only none | y | |||
87 | Config has scopes_supported | CheckScopeSupport() | y | y | ||||
88 | Config has response_types_supported | ProviderConfigurationResponse.verify() | y | y | ||||
89 | Config has subject_types_supported | ProviderConfigurationResponse.verify() | y | y | ||||
90 | Config has id_token_signing_alg_values_supported | ProviderConfigurationResponse.verify() | y unless only none | y | ||||
91 | Config has claims_supported | Verify that claims_supported is published | OP-Discovery-claims_supported | y | y | |||
92 | All OP endpoints use https | VerifyOPEndpointsUseHTTPS() | y | y | ||||
93 | Can Discover Identifiers using E-Mail Syntax | Can discover identifiers using e-mail syntax | OP-Discovery-WebFinger-Email | y | ||||
94 | Support WebFinger discovery | Can discover identifiers using URL syntax | OP-Discovery-WebFinger | y | ||||
95 | Dynamic Client Registration | |||||||
96 | Config has registration_endpoint | Verify that registration_endpoint is published | OP-Registration-Endpoint | y | ||||
97 | Enables dynamic registration | Client registration request | OP-Registration-Dynamic | y | ||||
98 | Support using Sector Identifier for pairwise sub values | no err | ||||||
99 | Displays logo_uri in login page | Registration with logo_uri | OP-Registration-logo_uri | SHOULD | ||||
100 | Displays policy_uri in login page | Registration with policy_uri | OP-Registration-policy_uri | SHOULD | ||||
101 | Displays tos_uri in login page | Registration with tos_uri | OP-Registration-tos_uri | SHOULD | ||||
102 | Uses keys registered with jwks value | Uses keys registered with jwks value | OP-Registration-jwks | y | ||||
103 | Uses keys registered with jwks_uri value | Uses keys registered with jwks_uri value | OP-Registration-jwks_uri | y | ||||
104 | Reject Sector Identifier not containing registered redirect_uri values | Incorrect registration of sector_identifier_uri | OP-Registration-Sector-Bad | y | ||||
105 | Key Rotation | |||||||
106 | Can rotate OP signing key | Can rotate OP signing keys | OP-Rotation-OP-Sig | y | ||||
107 | Support RP signing key rotation | Request access token, change RSA signing key and request another access token | OP-Rotation-RP-Sig | y | ||||
108 | request_uri Request Parameter | |||||||
109 | Support request_uri request parameter | Support request_uri request parameter | OP-request_uri-Support | y | ||||
110 | Support request_uri request parameter with unsecured request | Support request_uri request parameter with unsigned request | OP-request_uri-Unsigned | no err | no err | no err | ||
111 | Support request_uri request parameter with unsecured request | Support request_uri request parameter with unsigned request | OP-request_uri-Unsigned-Dynamic | y | ||||
112 | Support request_uri request parameter with signed request | Support request_uri request parameter with signed request | OP-request_uri-Sig | y | ||||
113 | request Request Parameter | |||||||
114 | Support request request parameter with unsecured request | Support request request parameter with unsigned request | OP-request-Unsigned | no err | no err | no err | ||
115 | claims Request Parameter | |||||||
116 | Support claims request parameter | Claims request with essential name claim | OP-claims-essential | no err | no err | no err | ||