Send the authorization code to the client redirect with code + state + iss | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: no agent scope is above the cap
- Refuse a QAuth API audience the client no longer lists: every QAuth API audience among the resources is one the client lists
- Check that the client is still what the step said: the client is what the step said
- Grant only the scopes the step showed, while the client may still have them: the shown scopes are still grantable
- Grant only the resources the step showed: the shown resources are the request's
- Ask for a fresh sign-in when the grant needs one: the sign-in is fresh enough
- Mint the authorization code, in the mint transaction: the code is written, for this request only
- Record the grant, in the same transaction, and commit: the events are recorded and the transaction commits
|
Send the browser to sign in afresh before the grant no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, prompt=login, or the client's first-party profile is native_backend (forcesLoginPrompt), and the sign-in is more than two minutes old (STEP_UP_FRESH_AUTH_WINDOW_MS) | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: no agent scope is above the cap
- Refuse a QAuth API audience the client no longer lists: every QAuth API audience among the resources is one the client lists
- Check that the client is still what the step said: the client is what the step said
- Grant only the scopes the step showed, while the client may still have them: the shown scopes are still grantable
- Grant only the resources the step showed: the shown resources are the request's
- Ask for a fresh sign-in when the grant needs one: the sign-in is too old for what is asked; step_up.required { reason: fresh_authentication_required or native_profile_login_required, dangerousScopes?, prompt?, maxAge? } is recorded
- Continue the request in a new sign-in interaction: the sign-in interaction is stored, for a step-up
|
Send the browser to sign in, for an account disabled since the step was shown no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, the account was disabled since the step was shown: liveBrowserSession finds no usable session for the user | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the account was disabled since: the request needs a sign-in
- Continue the request in a new sign-in interaction: the sign-in interaction is stored, for a disabled account
|
Send the browser to sign in, for a session that ended under the request no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: no agent scope is above the cap
- Refuse a QAuth API audience the client no longer lists: every QAuth API audience among the resources is one the client lists
- Check that the client is still what the step said: the client is what the step said
- Grant only the scopes the step showed, while the client may still have them: the shown scopes are still grantable
- Grant only the resources the step showed: the shown resources are the request's
- Ask for a fresh sign-in when the grant needs one: the sign-in is fresh enough
- Mint the authorization code, in the mint transaction: it fails, because the session ended under the request; nothing is written
- Continue the request in a new sign-in interaction: the sign-in interaction is stored, for a session that ended under the request
|
Tell the client the person denied the request redirect, error=access_denied | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision deny, whatever remember says, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person denied; consent.denied { error: access_denied } is recorded
|
Tell the client its dpop_jkt is malformed, now that DPoP is on redirect, error=invalid_request | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, DPoP was switched on since, and the dpop_jkt the request named is not one thumbprint, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed, and the request is refused for its dpop_jkt
|
Tell the client an agent scope is above its cap redirect, error=invalid_scope | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, the request's scope names an agent:* scope above the client's agent mode cap (any agent:* scope for a client that is no agent or has no cap), as findExceedingAgentScopesForClient reads it now | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: an agent scope is above the cap; consent.denied { error: invalid_scope, reason: agent_scope_mode_exceeded } is recorded
|
Tell the client it named a QAuth API audience it does not list redirect, error=invalid_target | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, a resource names a QAuth API audience (urn:qauth:aud:) the client no longer lists (unlistedReservedAudiences) | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: no agent scope is above the cap
- Refuse a QAuth API audience the client no longer lists: a resource names a QAuth API audience the client does not list; consent.denied { error: invalid_target, reason: reserved_audience_not_listed } is recorded
|
Refuse a shown scope set the client may no longer have redirect, error=invalid_scope | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, the shown scopes, filtered by the client's allowlist as it is now, are not the shown set | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: no agent scope is above the cap
- Refuse a QAuth API audience the client no longer lists: every QAuth API audience among the resources is one the client lists
- Check that the client is still what the step said: the client is what the step said
- Grant only the scopes the step showed, while the client may still have them: the client may no longer have every shown scope; consent.denied { error: invalid_scope, reason: consent_scope_mismatch } is recorded
|
Refuse shown resources that are not the request's redirect, error=invalid_target | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, the shown resources are not the request's (defensive: they cannot differ by construction) | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: no agent scope is above the cap
- Refuse a QAuth API audience the client no longer lists: every QAuth API audience among the resources is one the client lists
- Check that the client is still what the step said: the client is what the step said
- Grant only the scopes the step showed, while the client may still have them: the shown scopes are still grantable
- Grant only the resources the step showed: the shown resources are not the request's; consent.denied { error: invalid_target, reason: consent_resource_mismatch } is recorded
|
Tell the client the consent step cannot show its scopes redirect, error=invalid_scope | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the step cannot carry the scopes: more than 64, or one outside its alphabet (RFC 6749 §3.3 without < and >) or over 128 characters, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the scopes, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | At /oauth/authorize, for a client that registered itself: open registration, CIMD or a developer account, the step cannot carry the scopes: more than 64, or one outside its alphabet (RFC 6749 §3.3 without < and >) or over 128 characters, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the scopes, for a client no operator provisioned
|
Tell the client the consent step cannot show its scopes, at the finish of an interaction redirect, error=invalid_scope | At the finish of another interaction of the request: a sign-in, or a consent whose client changed whether it is an agent, the step cannot carry the scopes: more than 64, or one outside its alphabet (RFC 6749 §3.3 without < and >) or over 128 characters, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the scopes, at the finish of an interaction
|
Tell the client the consent step cannot show its resources redirect, error=invalid_target | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the step cannot carry the resources: more than 16, or one over 2048 characters, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the resources, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | At /oauth/authorize, for a client that registered itself: open registration, CIMD or a developer account, the step cannot carry the resources: more than 16, or one over 2048 characters, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the resources, for a client no operator provisioned
|
Tell the client the consent step cannot show its resources, at the finish of an interaction redirect, error=invalid_target | At the finish of another interaction of the request: a sign-in, or a consent whose client changed whether it is an agent, the step cannot carry the resources: more than 16, or one over 2048 characters, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the resources, at the finish of an interaction
|
Tell the client the consent step cannot show its audience redirect, error=invalid_target | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the request names no resource, and the step cannot carry the audience the token gets from the client's configuration: a value holding markup or a control character (the token endpoint reads at most 20 values of at most 256 characters, which the step carries), the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the client's audience, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | At /oauth/authorize, for a client that registered itself: open registration, CIMD or a developer account, the request names no resource, and the step cannot carry the audience the token gets from the client's configuration: a value holding markup or a control character (the token endpoint reads at most 20 values of at most 256 characters, which the step carries), the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the client's audience, for a client no operator provisioned
|
Tell the client the consent step cannot show its audience, at the finish of an interaction redirect, error=invalid_target | At the finish of another interaction of the request: a sign-in, or a consent whose client changed whether it is an agent, the request names no resource, and the step cannot carry the audience the token gets from the client's configuration: a value holding markup or a control character (the token endpoint reads at most 20 values of at most 256 characters, which the step carries), the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step cannot carry the client's audience, at the finish of an interaction
|
Refuse a redirect URI the consent step cannot describe, at /oauth/authorize no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, clientDisplay cannot describe where redirect_uri goes: an IPv6 address that is not loopback, a host that is not a DNS name of valid labels, or a scheme over 64 characters, which only a client registered before #593 holds, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the display cannot describe where the redirect URI goes, at /oauth/authorize
|
Refuse a redirect URI the consent step cannot describe, at the finish of an interaction no redirect, page shown | At the finish of another interaction of the request: a sign-in, or a consent whose client changed whether it is an agent, clientDisplay cannot describe where redirect_uri goes: an IPv6 address that is not loopback, a host that is not a DNS name of valid labels, or a scheme over 64 characters, which only a client registered before #593 holds, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the display cannot describe where the redirect URI goes, at the finish of an interaction
|
Refuse a request too large to hold in an interaction, at /oauth/authorize no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: it fails, because the request is over 16 KiB, or the record over 32 KiB
|
Refuse a next interaction too large to hold no redirect, page shown | At the finish of another interaction of the request: a sign-in, or a consent whose client changed whether it is an agent, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: it fails, because the record of the next interaction is over 32 KiB
|
Fail the request when the interaction store fails, at /oauth/authorize no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: it fails, because the interaction store fails
|
Refuse an answer the consent step's grammar does not accept no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, the answer does not pass the step grammar: no decision, another decision, a remember that is no boolean, or a member beyond type, csrf, decision and remember, such as a scope or a resource, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer does not pass the step grammar
|
Refuse an answer the expiry sweep beat no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: it fails, because the expiry sweep claimed the interaction first
|
Refuse an answer whose browser session ended since the step was shown no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: it fails, because the session the consent was for has ended, such as by a sign-out in another tab
|
Refuse an answer whose client or redirect URI no longer passes no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, client_id names no client any more, or the redirect URI was removed from it or is no longer permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the client, or its redirect URI, no longer passes
|
Refuse an answer whose client may no longer use the endpoint no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client was disabled or suspended, or lost the authorization_code grant or the code response type, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the client may no longer use the endpoint
|
Fail the answer when the interaction store fails no redirect, page shown | At the finish of another interaction of the request: a sign-in, or a consent whose client changed whether it is an agent, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: it fails, because the interaction store fails, at the finish of an interaction
|
Fail the answer when the mint transaction fails no redirect, page shown | At /oauth/authorize, for a client an operator provisioned: the system client or the seed manifest, the client display describes the redirect URI, and the step can carry the scopes, resources and audience, the client is not an agent when the step is built, decision allow, with remember false or absent, the client still resolves and may use the endpoint, its redirect URI is still registered and permitted, every check passes, and nothing asks for a fresh sign-in or the sign-in is fresh enough for what asks | - Wait for a request that needs consent: decideAuthorization answers consent for a signed-in browser session (core.authorization, consentNeeded): at /oauth/authorize, or at the finish of a sign-in interaction of the request
- Describe the client from the server's own records: the client is described
- Build the consent step from the request: the step can show the request
- Start the consent interaction: the interaction is stored
- Send the browser to the ceremony page of the consent interaction: the ceremony page reads the step by the interaction id
- Return the consent step: the person allows or denies, with the CSRF value of this view; the answer takes the turn
- Check the answer against the consent step's grammar: the answer passes the grammar
- End the interaction before anything is decided: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes, or only its dpop_jkt is refused
- Read the decision: the person allowed
- Find the session again, with its account: the session is live and its account may use it
- Refuse an agent scope above the client's cap, where the code is minted: no agent scope is above the cap
- Refuse a QAuth API audience the client no longer lists: every QAuth API audience among the resources is one the client lists
- Check that the client is still what the step said: the client is what the step said
- Grant only the scopes the step showed, while the client may still have them: the shown scopes are still grantable
- Grant only the resources the step showed: the shown resources are the request's
- Ask for a fresh sign-in when the grant needs one: the sign-in is fresh enough
- Mint the authorization code, in the mint transaction: it fails, because the database fails, or three codes in a row collide; nothing is written
|