Send the authorization code to the client redirect with code + state + iss | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is on: the Interaction API's ceremony page shows any further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential's user, and whether the account counts as verified, as its creation recorded
- Hand the account to the sign-in engine as proved by the upstream step: the engine answers its round
- Go on as the engine's round says: signed in: the interaction finishes the authorization request as the Interaction API does
|
Send the signed-in browser back to the authorization request no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential's user, and whether the account counts as verified, as its creation recorded
- Hand the account to the sign-in engine as proved by the upstream step: the engine answers its round
- Go on as the engine's round says: signed in: the pages start the authorization request again under the new session
|
Send the browser to the ceremony page for the next step no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the account holds a passkey, which ranks above an upstream sign-in, so the engine asks for it, the engine takes the proof, INTERACTION_UI_ENABLED is on: the Interaction API's ceremony page shows any further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential's user, and whether the account counts as verified, as its creation recorded
- Hand the account to the sign-in engine as proved by the upstream step: the engine answers its round
- Go on as the engine's round says: a further step (the passkey, a code): the ceremony page shows it
|
Show the provider-error page for a cancel at the provider no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the person cancelled or declined at the provider (error=access_denied), a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: the person cancelled or declined at the provider
|
Show the provider-error page for an error the provider answered no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the provider answered another error, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: the provider answered another error
|
Refuse a provider that is off or cannot start no redirect, page shown | The realm has no provider of that type, or has it off, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the realm has no such provider on
|
Refuse a callback with no pending sign-in for this browser no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, a browser with no such flow cookie: a callback replayed in another browser, forwarded or forged, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: no pending sign-in for this browser: a replay in another browser, a forged callback, or a spent one
|
Refuse an answer of the provider that fails a check no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity names no issuer (rawClaims.iss): an AuthMethod plugin that breaks the contract, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: the identity names no issuer: its sub could not be told apart from another issuer's
|
Refuse the answer of a method that broke the contract no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method broke the AuthMethod contract, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: the method broke the contract; its error is logged for the operator
|
Refuse a known sub under another issuer no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, it is another issuer: the provider was re-pointed, or another issuer reuses the sub, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential was created under another issuer: a sub is unique only within its issuer (OIDC Core §5.7), so the old credential never signs in under the new one
|
Refuse a disabled credential no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is disabled, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential is disabled
|
Refuse an unknown identity in a realm that does not allow sign-up no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, none does, whatever another account holds as its email, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, it is off, the default, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: an unknown identity, in a realm that does not allow sign-up
|
Refuse a new account nobody could verify no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, none does, whatever another account holds as its email, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, it is off: QAuth verifies the address of an account it creates with an emailed code, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: an unknown identity the provider's verified switch leaves unverified, with no address for a code or on the pages, which show no code step: it could never sign in, so nothing is written
|
Refuse a proof the engine refuses no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, it refuses it: the account is disabled, or the interaction moved on, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential's user, and whether the account counts as verified, as its creation recorded
- Hand the account to the sign-in engine as proved by the upstream step: the engine answers its round
- Go on as the engine's round says: the engine refuses the proof, and audits why
|
Refuse a sign-in the pages cannot finish no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the account holds a passkey, which ranks above an upstream sign-in, so the engine asks for it, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential's user, and whether the account counts as verified, as its creation recorded
- Hand the account to the sign-in engine as proved by the upstream step: the engine answers its round
- Go on as the engine's round says: a further step the pages cannot show: the sign-in fails closed
|
Refuse the callback when a store cannot answer no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: one credential or none
- Decide what the credential found allows: the credential's user, and whether the account counts as verified, as its creation recorded
- Hand the account to the sign-in engine as proved by the upstream step: it fails, because the interaction store or the failure ladder cannot answer
|
Fail on a database error no redirect, page shown | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the provider sends the browser to /upstream/<type>/callback (a form_post is bounced to the GET route)
- Hand the pending sign-in only to the browser that started it: the pending sign-in is taken and handed to the method's callback
- Turn the method's answer into the step's completion: an identity and its attributes
- Look the credential up by (realm, provider type, sub) alone: it fails, because the database fails
|
The person did not come back user leaves the page | The realm has the provider on, hidden or not, the provider's method starts and answers where the browser goes, the browser that started brings the flow cookie the pending sign-in is bound to, the method proved an identity, its assurance capped at low, a credential of the provider's type holds the identity's sub in the realm, the identity's issuer (the ID token's iss) is the one the credential was created under, credentialState is active, the provider's verified switch is on: an account it creates counts as verified, the provider gave an email, the realm's sign-up switch (accounts.allowSignUp) is on, the realm asks nothing more of the account, the engine takes the proof, INTERACTION_UI_ENABLED is off: the server-rendered pages, which show no further step | - Wait for a person who chooses an upstream provider: the person picks a provider: the upstream alternative of the first sign-in step (Interaction API), or a provider link of /ui/login, which sends the browser back to the authorization request with qauth_upstream
- Find the provider among the realm's: the interaction starts the provider in its first round, recorded by the engine
- Ask the provider's method to start: start() answers
- Keep the pending sign-in, bound to the interaction and the flow cookie: the waiting page (a meta refresh, a link for a browser that does not follow it, and the way back) sends the browser to the provider; through the Interaction API, the answer's location does
- Wait while the person is at the provider: the person never comes back
|