Send the authorization code to the client redirect with code + state + iss | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: the code is stored
|
Send the authorization code to the client once the interaction finished redirect with code + state + iss | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes
- Find the session the interaction holds: the session is live: the request is decided again for it
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: the code is stored, for the request whose interaction finished
|
Send a browser with no session to sign in no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries no session cookie, or one that names a cookie key this process has not read yet and may not read again yet (#493), which is left for the next request, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: no usable session: the person signs in first, and the request is decided again with that session
- Send the person to sign in: INTERACTION_UI_ENABLED is off
- Park the authorization request for the sign-in: the request is parked, for a request with no session
|
Send a browser whose session cookie is of no use to sign in no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the cookie does not verify with the realm's cookie keys, or its session has ended or expired, or its user has been deleted or disabled, or was disabled after the session began; the cookie is cleared, and a disabled user's session is ended, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: no usable session: the person signs in first, and the request is decided again with that session
- Send the person to sign in: INTERACTION_UI_ENABLED is off
- Park the authorization request for the sign-in: the request is parked, for a cookie of no usable session
|
Send a browser whose sign-in is too old for the request to sign in again no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, prompt=login, a dangerous scope (write:*, agent:admin, agent:exec) outside development, or a native_backend client asks for a sign-in within the last two minutes and it is older; or max_age asks for one within that many whole seconds and it is older, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is too old for what is asked: the person signs in again
- Send the person to sign in: INTERACTION_UI_ENABLED is off
- Park the authorization request for the sign-in: the request is parked, for a step-up
|
Send a browser whose session ended under the request to sign in again no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the session ended under the request: the person signs in again
- Send the person to sign in: INTERACTION_UI_ENABLED is off
- Park the authorization request for the sign-in: the request is parked, for a session that ended under it
|
Send the signed-in user to the consent page no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: INTERACTION_UI_ENABLED is off
|
Send the user whose consent was revoked under the request to the consent page no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the consent was revoked under the request: the person is asked again
- Send the person to consent: INTERACTION_UI_ENABLED is off, and the consent was revoked under the request
|
Tell the client the person cancelled redirect, error=access_denied | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the person cancels, with the CSRF value of the step they see; the interaction ends
- Check the request again before the cancel goes to the client: the request still passes
|
Leave the answer to the consent step's graph ends here | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: the consent step can show the request
- Start a consent interaction: the interaction is stored
- The person is asked for consent at the ceremony page: the person answers the consent step
|
Refuse a request for an interaction that already finished no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: an answer, a cancel or a read names an interaction of this request that already finished, such as a replayed or a second form post
|
Refuse a finish the expiry sweep beat no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: it fails, because the expiry sweep claimed the interaction first
|
Refuse a finish whose session ended since no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: it fails, because the session the sign-in started has ended since, such as by a sign-out in another tab
|
Refuse a finish or a cancel whose client or redirect URI no longer passes no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, by the finish or the cancel, client_id names no client any more, or its redirect URI was removed or is no longer permitted, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the person cancels, with the CSRF value of the step they see; the interaction ends
- Check the request again before the cancel goes to the client: the client, or its redirect URI, no longer passes
|
Refuse a finish or a cancel whose client may no longer use the endpoint no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, by the finish or the cancel, the client was disabled or suspended, or lost the authorization_code grant or the code response type, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the person cancels, with the CSRF value of the step they see; the interaction ends
- Check the request again before the cancel goes to the client: the client may no longer use the endpoint
|
Refuse a next interaction too large to hold no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, it ended, or its account was disabled, between the interaction's finish and the decision: the request needs a sign-in again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes
- Find the session the interaction holds: the session is no longer usable: the request needs a sign-in again
- Send the person to sign in: the request is decided at the finish of an interaction: the next interaction continues it
- Continue the request in a new sign-in interaction: it fails, because the record of the next interaction is over 32 KiB
|
Fail the answer when the interaction store fails no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: it fails, because the interaction store fails; the turn is given back
|
Fail the answer when the database fails at the mint no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes
- Find the session the interaction holds: the session is live: the request is decided again for it
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the database fails, when the interaction finished
|
Tell the client an agent scope is above its cap, once the person signed in redirect, error=invalid_scope | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, the scope parameter 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), it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes
- Find the session the interaction holds: the session is live: the request is decided again for it
- Refuse an agent scope above the client's cap: an agent scope is above the cap, decided when the interaction finished
|
Tell the client it named an audience it does not list, once the person signed in redirect, error=invalid_target | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, a resource indicator names a QAuth API audience (urn:qauth:aud:) the client does not list, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes
- Find the session the interaction holds: the session is live: the request is decided again for it
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: a resource names a QAuth API audience the client does not list, decided when the interaction finished
|
Tell the client the consent step cannot show its scopes, once the person signed in redirect, error=invalid_scope | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, the consent step cannot show the scopes: more than 64, or one outside its alphabet (RFC 6749 §3.3 without < and >) or over 128 characters; read only when an interaction asks for consent, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes
- Find the session the interaction holds: the session is live: the request is decided again for it
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: the consent step cannot show the scopes, decided when the interaction finished
|
Tell the client the consent step cannot show its resources, once the person signed in redirect, error=invalid_target | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, the consent step cannot show the resources: more than 16, or one over 2048 characters; read only when an interaction asks for consent, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: the interaction is stored
- The person registers at the ceremony page: the new password creates the account, which finishes the interaction
- End the interaction before anything is issued: the interaction is over
- Check the request again, as the endpoint checks it: the request still passes
- Find the session the interaction holds: the session is live: the request is decided again for it
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: the consent step cannot show the resources, decided when the interaction finished
|
Tell the client its dpop_jkt is malformed redirect, error=invalid_request | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, DPoP is on and dpop_jkt is not one base64url SHA-256 thumbprint, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is not one thumbprint, for a client an operator provisioned
|
Show, rather than redirect, the dpop_jkt error of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, DPoP is on and dpop_jkt is not one base64url SHA-256 thumbprint, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is not one thumbprint, for a client no operator provisioned
|
Tell the client prompt=create needs the openid scope redirect, error=invalid_request | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create without the openid scope, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: prompt=create without openid, for a client an operator provisioned
|
Show, rather than redirect, the openid error of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create without the openid scope, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: prompt=create without openid, for a client no operator provisioned
|
Tell the client the realm offers no sign-up redirect, error=invalid_request | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid, and the realm's accounts.allowSignUp is off, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the realm offers no sign-up, for a client an operator provisioned
|
Show, rather than redirect, the sign-up refusal of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid, and the realm's accounts.allowSignUp is off, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the realm offers no sign-up, for a client no operator provisioned
|
Tell the client it may not register accounts redirect, error=unauthorized_client | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid, the realm allows sign-up, and the client's operator-set hosted_flows do not name register, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the client may not register accounts, for a client an operator provisioned
|
Show, rather than redirect, the registration refusal of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid, the realm allows sign-up, and the client's operator-set hosted_flows do not name register, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the client may not register accounts, for a client no operator provisioned
|
Tell the client prompt=create takes no max_age redirect, error=invalid_request | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: prompt=create with max_age, for a client an operator provisioned
|
Show, rather than redirect, the max_age error of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: prompt=create with max_age, for a client no operator provisioned
|
Tell the client prompt=none found no session redirect, error=login_required | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries no session cookie, or one that names a cookie key this process has not read yet and may not read again yet (#493), which is left for the next request, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: no usable session under prompt=none, for a client an operator provisioned; step_up.required is recorded
|
Show, rather than redirect, the login_required of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries no session cookie, or one that names a cookie key this process has not read yet and may not read again yet (#493), which is left for the next request, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: no usable session under prompt=none, for a client no operator provisioned
|
Tell the client an agent scope is above its cap redirect, error=invalid_scope | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, the scope parameter 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), it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: an agent scope is above the cap, for a client an operator provisioned
|
Show, rather than redirect, the agent-cap error of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, the scope parameter 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), it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: an agent scope is above the cap, for a client no operator provisioned
|
Tell the client it named a QAuth API audience it does not list redirect, error=invalid_target | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, a resource indicator names a QAuth API audience (urn:qauth:aud:) the client does not list, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: a resource names a QAuth API audience the client does not list, for a client an operator provisioned
|
Show, rather than redirect, the audience error of a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, a resource indicator names a QAuth API audience (urn:qauth:aud:) the client does not list, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: a resource names a QAuth API audience the client does not list, for a client no operator provisioned
|
Tell the client prompt=none cannot give the fresh sign-in the request needs redirect, error=login_required | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, prompt=login, a dangerous scope (write:*, agent:admin, agent:exec) outside development, or a native_backend client asks for a sign-in within the last two minutes and it is older; or max_age asks for one within that many whole seconds and it is older, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: prompt=none, and the sign-in is too old for what is asked, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, prompt=login, a dangerous scope (write:*, agent:admin, agent:exec) outside development, or a native_backend client asks for a sign-in within the last two minutes and it is older; or max_age asks for one within that many whole seconds and it is older, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: prompt=none, and the sign-in is too old for what is asked, for a client no operator provisioned
|
Tell the client prompt=none cannot ask for the consent the request needs redirect, error=consent_required | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: prompt=none, and no consent covers the request, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: prompt=none, and no consent covers the request, for a client no operator provisioned
|
Tell the client under prompt=none that the session ended under the request redirect, error=login_required | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the session ended under the request, under prompt=none, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the session ended under the request, under prompt=none, for a client no operator provisioned
|
Tell the client under prompt=none that the consent was revoked under the request redirect, error=consent_required | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the consent was revoked under the request, under prompt=none, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, the request carries prompt=none: no page may be shown, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the consent was revoked under the request, under prompt=none, for a client no operator provisioned
|
Tell the client the consent step cannot show its scopes redirect, error=invalid_scope | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, the consent step cannot show the scopes: more than 64, or one outside its alphabet (RFC 6749 §3.3 without < and >) or over 128 characters; read only when an interaction asks for consent, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: the consent step cannot show the scopes, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, the consent step cannot show the scopes: more than 64, or one outside its alphabet (RFC 6749 §3.3 without < and >) or over 128 characters; read only when an interaction asks for consent, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: the consent step cannot show the scopes, for a client no operator provisioned
|
Tell the client the consent step cannot show its resources redirect, error=invalid_target | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, the consent step cannot show the resources: more than 16, or one over 2048 characters; read only when an interaction asks for consent, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: the consent step cannot show the resources, for a client an operator provisioned
|
Show, rather than redirect, that error for a client no operator provisioned no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, the client registered itself: open registration, CIMD or a developer account, the request carries the cookie of a live browser session of an enabled user, the consent step cannot show the resources: more than 16, or one over 2048 characters; read only when an interaction asks for consent, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, no stored consent covers the request, prompt=consent asks for the screen, the request widens a prior grant, or the client is an AI agent, which never skips the screen (ADR-015 Decision 11), the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: no consent covers the request: the person is asked
- Send the person to consent: the consent step cannot show the resources, for a client no operator provisioned
|
Refuse parameters the schema does not accept no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the query (GET) or the form (POST) does not pass authorizeQuerySchema: a missing or malformed code_challenge, a code_challenge_method other than S256, a response_type other than code, a state or nonce over 2048 characters, a login_hint over 254 bytes, a resource that is not an absolute URI, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters do not match the schema
|
Refuse a client_id that names no client no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, client_id names no client of the realm, or a CIMD document that does not resolve, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client_id names no client of the realm
|
Refuse a redirect URI the client did not register no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, redirect_uri is none of the client's (a loopback URI may differ only in its port), an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is not registered for the client
|
Refuse a redirect URI no environment permits no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, redirect_uri is the client's, but no environment permits it: a scheme outside the allowed ones, plain http to a host that is not loopback, or http to localhost outside development, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: no environment permits that redirect_uri
|
Refuse a disabled or suspended client no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the client is disabled or suspended, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client is disabled or suspended
|
Refuse a client not registered for the authorization_code grant no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the client is not registered for the authorization_code grant, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client is not registered for the authorization_code grant
|
Refuse a client not registered for the code response type no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the client is not registered for the code response type, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client is not registered for the code response type
|
Refuse a request too large to hold through the sign-in or the consent no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: it fails, because the request is over 16 KiB, or the record over 32 KiB
|
Refuse a host this server does not answer for here no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host names no realm, a disabled realm or a realm with no issuer, or it is one of the realm's endpoint hosts, which serve no browser route, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the host names no enabled realm with an issuer, or is one of its endpoint hosts
|
Refuse an address over the authorize limit no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the address has used up its AUTHORIZE_RATE_LIMIT requests for the window, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address has used up its requests
|
Fail a request whose session cookie cannot be decoded no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the session cookie's value is not valid percent-encoding, such as %zz, which the cookie reader decodes without a catch, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the session cookie cannot be decoded
|
Fail the request when the database fails at the mint no redirect, page shown | INTERACTION_UI_ENABLED is off, the default: the sign-in and the consent are the server-rendered pages, the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, the request carries no prompt=create, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the request carries no prompt=create
- Find the browser session: the session is live
- Refuse an agent scope above the client's cap: no agent scope is above the cap; the scopes are the requested ones the client's allowlist holds
- Refuse a QAuth API audience the client does not list: every QAuth API audience among the resources is one the client lists
- Read the consent, and decide whether the sign-in is fresh enough and the consent covers the request: the sign-in is fresh enough and a consent covers the request
- Mint the authorization code under the consent and the session: it fails, because the database fails
|
Fail the request when the interaction store fails no redirect, page shown | INTERACTION_UI_ENABLED is on: the sign-in and the consent are interactions (#628), the host is the primary host of an enabled realm, the address is under its limit, the parameters pass the route schema, and the client, its redirect URI, its grant and response type and dpop_jkt all pass, an operator provisioned the client (provisioned_by_operator): the system client or the seed manifest, the request carries the cookie of a live browser session of an enabled user, nothing in the request is refused after the session, it carries no prompt, or prompt=login, prompt=consent or prompt=create, prompt=create with openid and no max_age, the realm and the client allowing sign-up, nothing asks for a fresh sign-in, or the sign-in is fresh enough for what asks, a stored consent covers every requested scope at each requested resource, or the client's administrative consent does (ADR-017 Decision 9), and nothing asks for the screen, the client and its redirect URI still pass when the interaction finishes or is cancelled, the session the interaction holds is live and its account may use it, when the request is decided again | - Wait for an authorization request: GET /oauth/authorize arrives with its parameters in the query, or POST with them in a form
- Find the realm of the host: the request has its realm
- Count the request against the authorize limit: the address is under its limit
- Check the parameters against the authorize schema: the parameters match the schema
- Find the client: the client is found
- Check the redirect URI against the client's registration: redirect_uri is registered
- Check the redirect URI against the environment policy: the environment permits the redirect URI
- Check that the client may use the endpoint: the client may use the endpoint
- Read the DPoP key the code is to be bound to: dpop_jkt is absent, unread or well formed
- Check a request for a registration: the registration is allowed
- Start a registration interaction: it fails, because the interaction store fails
|