structure-typThe JWT header "typ" MUST be "oauth-id-jag+jwt" (explicit typing per RFC 8725 Section 3.11).
breaks it (typ-wrong): Header typ is wrong; the draft requires oauth-id-jag+jwt.
DRAFT-IETF-OAUTH-IDENTITY-ASSERTION-AUTHZ-GRANT · THE AUTHOR-FACING INDEX
Every token, metadata, and exchange rule in draft -05 and -04 of Identity Assertion JWT Authorization Grants, grouped by section cite: the normative keyword, what the validator checks, and a deliberately broken example wherever the engine ships a committed negative fixture - rendered at build time from the id-jag-validate engine.
Every rule the validator console evaluates, pinned to the exact section of the draft that requires it. Rows are grouped by section cite so an author can read one section as its own checklist: what the draft demands, which keyword carries the demand, what the engine does about it, and - where a committed negative fixture exists - what a broken grant looks like. Nothing here runs at request time: both rulesets are rendered into this page when the site builds.
structure-typThe JWT header "typ" MUST be "oauth-id-jag+jwt" (explicit typing per RFC 8725 Section 3.11).
breaks it (typ-wrong): Header typ is wrong; the draft requires oauth-id-jag+jwt.
claims-requirediss, sub, aud, client_id, jti, exp, and iat are REQUIRED claims of the ID-JAG.
breaks it (missing-jti): The REQUIRED jti claim is absent.
claims-resource-shapeWhen present, resource carries the RFC 8707 Resource Identifier of the Resource Server as a single URI or an array of URIs; the engine additionally requires array entries to be non-empty unique strings.
claims-authorization-details-shapeWhen present, authorization_details MUST be a JSON array of authorization detail objects (RFC 9396).
claims-string-claims-shapeWhen present, scope, tenant, aud_tenant, aud_sub, and email MUST each be a JSON string.
claims-subject-resolution-recommendedIt is RECOMMENDED that the ID-JAG contain an email and/or aud_sub claim (subject resolution plus JIT provisioning).
claims-act-informationalact is OPTIONAL (RFC 8693 Section 4.1); the engine surfaces actor context informationally and never renders a verdict on it.
semantics-sub-sub-id-same-userWhen both sub and sub_id are present, they MUST identify the same End-User; the engine flags the pair for confirmation.
semantics-aud-sub-uniquenessaud + aud_tenant and aud_sub MUST be unique within the Resource Authorization Server; requires RAS-side state.
structure-algThe signature MUST be validated as required by RFC 7521 Section 5.2 with an allow-listed algorithm; the engine pins verification to RS256 and ES256 and rejects alg none and every other value as rule outcomes.
structure-signatureThe ID-JAG signature MUST verify against the issuing IdP's published keys; the engine verifies a supplied JWK, and key discovery is a host concern.
claims-aud-shapeThe aud claim MUST be a string or a single-element array whose element is the RAS issuer identifier; anything else is rejected (this prevents audience injection attacks).
breaks it (aud-two-elements): aud is a two-element array; exactly one RAS issuer element is allowed.
semantics-aud-valueThe aud claim MUST contain the issuer identifier of the Resource Authorization Server; a mismatch is rejected with invalid_grant.
breaks it (aud-token-endpoint): aud carries the token endpoint, the pre-bis RFC 7523 legacy value, instead of the RAS issuer.
semantics-client-continuityThe client_id claim MUST identify the same client as the request's client authentication; a mismatch is client-continuity failure, rejected with invalid_grant.
breaks it (client-id-mismatch): client_id does not identify the authenticated client.
claims-numeric-datesexp and iat MUST be NumericDate values (numbers of seconds).
semantics-iss-trustThe assertion's Issuer must be recognized by the authorization server: the engine checks iss against the trusted issuer the host supplies (-04 states the trust; the explicit rejection enters with -05).
semantics-sub-uniquenessSubject identifiers MUST be unique when scoped with issuer (and tenant for multi-tenant issuers); requires RAS-side state.
semantics-tenant-requiredWhen the RAS is multi-tenant the IdP MUST include the tenant claim (Section 6.3); needs deployment input.
semantics-client-id-cimdThe IdP must know the client_id relationship, maintained out of band; when clients use Client-ID Metadata Documents the URL client_id acts as a shared global namespace and removes the mapping.
subid-formatA sub_id in the SAML NameID Subject Identifier Format MUST contain format (saml-nameid), issuer, and nameid, and MAY contain nameid_format, name_qualifier, sp_name_qualifier, and sp_provided_id; a malformed or unsupported format is rejected with invalid_grant.
breaks it (subid-malformed): sub_id is missing the REQUIRED nameid member.
subid-nameid-onlyThe RAS MUST compare every member it uses for that issuer's subject resolution and MUST NOT resolve on the nameid value alone unless local policy says so; a nameid without scoping members is the resolution trap.
breaks it (subid-nameid-only): sub_id resolves on nameid alone without scoping members; the resolution trap.
subid-constructionsub_id members MUST derive from the SSO <NameID> for that RAS, with optional fields present exactly when the attributes are; needs IdP-side state.
subid-required-policyThe RAS MUST reject with invalid_grant when sub_id is missing when required, malformed, or unauthorized; policy input decides.
metadata-idp-token-typeAn IdP Authorization Server SHOULD include urn:ietf:params:oauth:token-type:id-jag in identity_chaining_requested_token_types_supported.
metadata-ras-profileA Resource Authorization Server SHOULD include urn:ietf:params:oauth:grant-profile:id-jag in authorization_grant_profiles_supported (advertisement means the processing rules are implemented).
metadata-ras-couplingA RAS advertising urn:ietf:params:oauth:grant-profile:id-jag MUST also include urn:ietf:params:oauth:grant-type:jwt-bearer in grant_types_supported.
metadata-grant-profiles-shapeauthorization_grant_profiles_supported MUST be a JSON array of strings, each naming a supported grant profile.
metadata-client-profileA client SHOULD include urn:ietf:params:oauth:grant-profile:id-jag in its authorization_grant_profiles_supported.
metadata-client-grant-typesA client advertising the id-jag profile MUST include both urn:ietf:params:oauth:grant-type:token-exchange and urn:ietf:params:oauth:grant-type:jwt-bearer in its grant_types.
mint-requested-token-typerequested_token_type is REQUIRED and must be urn:ietf:params:oauth:token-type:id-jag.
mint-audienceaudience is REQUIRED and identifies the Resource Authorization Server for the ID-JAG.
mint-subject-tokenImplementations MUST accept Identity Assertions as subject_token and MAY accept refresh tokens.
mint-subject-token-typesubject_token_type is REQUIRED and must be consistent with the subject_token.
mint-actor-tokenactor_token is OPTIONAL and its processing is out of scope.
mint-assertion-audienceThe IdP MUST validate the subject assertion and check its audience against the authenticated client_id.
mint-refresh-validationRefresh-token subject tokens get standard refresh-grant validation at the IdP.
mint-refresh-assemblyA refresh-token exchange SHOULD re-assemble current subject claims for the issued ID-JAG.
mint-granted-valuesGranted resource, scope, and authorization_details values MUST be reflected in the issued ID-JAG.
rejection-not-expiredAn expired assertion MUST be rejected with invalid_grant (RFC 7521 Section 5.2).
breaks it (expired): The token expired before the evaluation time.
structure-typThe JWT header "typ" MUST be "oauth-id-jag+jwt" (explicit typing per RFC 8725 Section 3.11).
breaks it (typ-wrong): Header typ is wrong; the draft requires oauth-id-jag+jwt.
claims-requirediss, sub, aud, client_id, jti, exp, and iat are REQUIRED claims of the ID-JAG.
breaks it (missing-jti): The REQUIRED jti claim is absent.
claims-resource-shapeWhen present, resource is a string or a non-empty JSON array of unique strings (RFC 8707 resource identifiers).
claims-authorization-details-shapeWhen present, authorization_details MUST be a JSON array of authorization detail objects (RFC 9396).
claims-string-claims-shapeWhen present, scope, tenant, aud_tenant, aud_sub, and email MUST each be a JSON string.
claims-subject-resolution-recommendedIt is RECOMMENDED that the ID-JAG contain an email and/or aud_sub claim so the RAS can perform subject resolution, including JIT provisioning.
claims-act-informationalact is OPTIONAL (RFC 8693 Section 4.1); the engine surfaces actor context informationally and never renders a verdict on it.
semantics-sub-sub-id-same-userWhen both sub and sub_id are present, they MUST identify the same End-User; the engine flags the pair for confirmation.
semantics-aud-sub-uniquenessaud + aud_tenant and aud_sub MUST be unique within the Resource Authorization Server; requires RAS-side state.
structure-algRS256 is mandatory to implement for both authorization servers (Section 5 of RFC 7523), and the Resource AS SHOULD also support ES256; the engine accepts exactly RS256 and ES256 and rejects alg none and every other value as rule outcomes.
structure-signatureThe ID-JAG signature MUST be validated against the trusted issuer's keys (from jwks_uri) as required by RFC 7521 Section 5.2.
claims-aud-shapeThe aud claim MUST be a string containing the RAS issuer identifier, or an array containing exactly that one element; anything else is rejected (this prevents audience injection attacks).
breaks it (aud-two-elements): aud is a two-element array; exactly one RAS issuer element is allowed.
semantics-aud-valueThe aud claim MUST contain the issuer identifier of the Resource Authorization Server; a mismatch is rejected with invalid_grant.
breaks it (aud-token-endpoint): aud carries the token endpoint, the pre-bis RFC 7523 legacy value, instead of the RAS issuer.
semantics-iss-trustThe RAS MUST reject the ID-JAG with invalid_grant if iss does not identify an IdP Authorization Server it trusts.
semantics-client-continuityIf the client authenticates, the RAS MUST reject the request with invalid_grant unless the client_id claim identifies the authenticated client.
breaks it (client-id-mismatch): client_id does not identify the authenticated client.
claims-numeric-datesexp and iat MUST be NumericDate values (numbers of seconds).
semantics-sub-uniquenessSubject identifiers MUST be unique when scoped with issuer (and tenant for multi-tenant issuers); requires RAS-side state.
semantics-tenant-requiredA multi-tenant issuer MUST include the tenant claim, and the RAS MUST trust iss and tenant together; needs deployment input.
semantics-client-id-cimdThe client_id relationship may be mapped out of band; when clients use Client-ID Metadata Documents the URL client_id acts as a shared global namespace and removes the mapping.
subid-formatA sub_id in the SAML NameID Subject Identifier Format MUST contain format (saml-nameid), issuer, and nameid, and MAY contain nameid_format, name_qualifier, sp_name_qualifier, and sp_provided_id; a malformed or unsupported format is rejected with invalid_grant.
breaks it (subid-malformed): sub_id is missing the REQUIRED nameid member.
subid-transient-nameidTransient SAML NameID Formats (such as urn:oasis:names:tc:SAML:2.0:nameid-format:transient) MUST NOT be used: their values change across sessions and cannot serve as a cross-trust-domain identifier.
subid-nameid-onlyThe RAS MUST NOT resolve the subject using only the nameid value unless local policy defines nameid alone as the subject identifier for that SAML issuer; a nameid without scoping members is the resolution trap.
breaks it (subid-nameid-only): sub_id resolves on nameid alone without scoping members; the resolution trap.
subid-pairwise-mappingPairwise nameid values MUST be scoped to the Service Provider of the target RAS, with the mapping maintained; needs IdP-side state.
subid-constructionsub_id members MUST derive from the SSO <NameID> for that RAS, with optional fields present exactly when the attributes are; needs IdP-side state.
subid-required-policyA RAS requiring the SAML NameID sub_id MUST reject with invalid_grant when it is missing, malformed, or unauthorized; policy input decides.
metadata-idp-token-typeAn IdP Authorization Server SHOULD include urn:ietf:params:oauth:token-type:id-jag in identity_chaining_requested_token_types_supported.
metadata-idp-signing-algid_jag_signing_alg_values_supported, when present, MUST include RS256.
metadata-grant-profiles-shapeauthorization_grant_profiles_supported MUST be a JSON array of strings, each naming a supported grant profile.
metadata-ras-profileA Resource Authorization Server SHOULD include urn:ietf:params:oauth:grant-profile:id-jag in authorization_grant_profiles_supported (advertisement means the processing rules are implemented).
metadata-ras-couplingA RAS advertising urn:ietf:params:oauth:grant-profile:id-jag MUST also include urn:ietf:params:oauth:grant-type:jwt-bearer in grant_types_supported.
metadata-client-profileA client SHOULD include urn:ietf:params:oauth:grant-profile:id-jag in its authorization_grant_profiles_supported.
metadata-client-grant-typesA client advertising the id-jag profile MUST include both urn:ietf:params:oauth:grant-type:token-exchange and urn:ietf:params:oauth:grant-type:jwt-bearer in its grant_types.
mint-requested-token-typerequested_token_type is REQUIRED and must be urn:ietf:params:oauth:token-type:id-jag.
mint-audienceaudience is REQUIRED and must carry exactly one Resource Authorization Server identifier.
mint-subject-tokenImplementations MUST accept Identity Assertions as subject_token and MAY accept refresh tokens.
mint-subject-token-typesubject_token_type is REQUIRED and must be consistent with the subject_token.
mint-actor-tokenactor_token is OPTIONAL; its processing is out of scope for this specification.
mint-assertion-audienceThe IdP MUST validate the subject assertion and check its audience against the authenticated client_id.
mint-refresh-validationRefresh-token subject tokens get standard refresh-grant validation at the IdP.
mint-refresh-assemblyA refresh-token exchange SHOULD re-assemble current subject claims for the issued ID-JAG.
mint-granted-valuesGranted resource, scope, and authorization_details values MUST be reflected in the issued ID-JAG.
mint-policy-narrowingThe IdP MAY narrow requested resources, scopes, or authorization details by policy.
rejection-not-expiredAn expired assertion MUST be rejected with invalid_grant (RFC 7521 Section 5.2).
breaks it (expired): The token expired before the evaluation time.
rejection-error-mappingValidation failures map to invalid_grant; authorization denials map to access_denied.
rejection-no-refresh-tokenThe RAS SHOULD NOT return a refresh token on an ID-JAG exchange; the ID-JAG itself is re-submittable.
rejection-jti-single-useThe RAS MAY enforce single use by tracking jti and MAY cap exp by policy; replay tracking needs RAS-side state.
Normative - the rules above cite these: