Resume the authorization request ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: GET /ui/resume/<handle> arrives for a handle this walk did not sign in for
- Find the realm of the host: the request has its realm
- Count the request against the global limit: the address is under its limit
- Swap the handle for the parked authorize URL, and burn it: the handle is deleted, and its authorize URL read back
|
Send the signed-in browser to return_to ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is another same-origin relative path, such as /account, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the attempt is counted on the account's ladder, and the next wait set
- Check the password: the password is right
- Apply the verified-account gate: the address is confirmed, or the gate is off
- Read the user, for its enabled flag: the user is enabled
- Settle the counted attempt: the attempt is settled
- Create a new browser session: the session is created, with a new sid; no cookie the request carried is read
- Record the time of the sign-in on the user: lastLoginAt is written
- Record the sign-in: return_to is a same-origin path; the session cookie is set and the login-CSRF one cleared
|
Send the signed-in browser to / ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is absent, or not a same-origin relative path: another host, //host, /\host, a control character or a space, more than 16 KiB; the page carries / in its place, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the attempt is counted on the account's ladder, and the next wait set
- Check the password: the password is right
- Apply the verified-account gate: the address is confirmed, or the gate is off
- Read the user, for its enabled flag: the user is enabled
- Settle the counted attempt: the attempt is settled
- Create a new browser session: the session is created, with a new sid; no cookie the request carried is read
- Record the time of the sign-in on the user: lastLoginAt is written
- Record the sign-in: return_to is absent or unsafe, so the browser goes to /; the session cookie is set and the login-CSRF one cleared
|
Refuse a form whose CSRF value is not the cookie's, and offer a fresh one ends here | The POST carries no login-CSRF cookie, one whose signature does not verify, or one whose value is not the posted csrf_token, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the cookie is missing, forged or holds another value
|
Refuse a locked-out address with the form ends here | The address being signed in to, or the client address, is locked out: the realm's bruteForce.maxAttempts attempts were counted on it within its bruteForce.windowSeconds, and its bruteForce.lockoutSeconds have not passed (#528: the realm's policies, which the FAILED_LOGIN_* keys seed in a new realm); or this attempt reached the threshold together with another one, which armed the lockout first, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: an identifier is locked out; the floor is waited out, then user.sign_in_failed is recorded with the reason locked_out
|
Refuse an attempt inside the account's wait with the form ends here | The account the address names, held or not, is inside the wait of its failure ladder: from its 5th consecutive counted failure, the n-th makes the next attempt wait 2^(n-5) seconds, at most 15 minutes; and the client address has not signed in to the account in the last 30 days, or 20 of the run's counted failures already came from addresses that have (#968), the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the account is inside its wait; the floor is waited out, then user.sign_in_failed is recorded with the reason locked_out
|
Refuse the attempt when the failure ladder cannot answer ends here | The failure ladder's store (Redis) or the realm's cookie key cannot be read in time, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the ladder cannot answer; the floor is waited out, then user.sign_in_failed is recorded with the reason internal_error
|
Refuse an address with no account, like a wrong password ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has no password credential in this realm, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the attempt is counted on the account's ladder, and the next wait set
- Check the password: no credential has this address; the decoy hash is verified, and the floor waited out
|
Refuse a wrong password ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a password credential in this realm, its address confirmed, and its user is enabled, it is another one, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the attempt is counted on the account's ladder, and the next wait set
- Check the password: the password does not verify against the hash; the floor is waited out
|
Refuse an unconfirmed account under the gate, like a wrong password ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a password credential whose address is not confirmed yet, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the attempt is counted on the account's ladder, and the next wait set
- Check the password: the password is right
- Apply the verified-account gate: the address is not confirmed, and the gate is on; the floor is waited out
|
Refuse a disabled user, like a wrong password ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a confirmed password credential, and its user is disabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the attempt is counted on the account's ladder, and the next wait set
- Check the password: the password is right
- Apply the verified-account gate: the address is confirmed, or the gate is off
- Read the user, for its enabled flag: the user is disabled; the floor is waited out
|
Tell the user the authorization request has expired ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: GET /ui/resume/<handle> arrives for a handle this walk did not sign in for
- Find the realm of the host: the request has its realm
- Count the request against the global limit: the address is under its limit
- Swap the handle for the parked authorize URL, and burn it: it fails, because the store cannot be read or the handle not deleted, which is answered as a spent handle, never a 500
|
Refuse a query that does not match the page's schema ends here | The query (GET /ui/login) or the form (POST) does not pass the route schema, such as a repeated return_to, an empty password or a missing csrf_token; GET /ui/resume has no schema that can fail, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: GET /ui/login arrives: sent by /oauth/authorize or the consent screen with return_to=/ui/resume/<handle>, or opened directly
- Find the realm of the host: the request has its realm
- Count the request against the global limit: the address is under its limit
- Check the query against the page's schema: the query does not match the schema
|
Refuse a form that does not match the login form schema ends here | The query (GET /ui/login) or the form (POST) does not pass the route schema, such as a repeated return_to, an empty password or a missing csrf_token; GET /ui/resume has no schema that can fail, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form does not match the schema
|
Refuse a host that serves no browser route ends here | The host names no realm, a disabled realm or a realm with no issuer, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: GET /ui/login arrives: sent by /oauth/authorize or the consent screen with return_to=/ui/resume/<handle>, or opened directly
- Find the realm of the host: the host names no enabled realm with an issuer
|
Refuse a GET over the global limit ends here | The address has used up its requests for the window: the global limit for the two GETs, the login limit for the POST, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: GET /ui/login arrives: sent by /oauth/authorize or the consent screen with return_to=/ui/resume/<handle>, or opened directly
- Find the realm of the host: the request has its realm
- Count the request against the global limit: the address has used up its requests
|
Refuse a POST over the login limit ends here | The address has used up its requests for the window: the global limit for the two GETs, the login limit for the POST, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address has used up its login requests
|
Fail on a login-CSRF cookie that cannot be decoded ends here | The request carries a login-CSRF cookie whose value is not valid percent-encoding, such as %zz, which the cookie reader decodes without a catch; GET /ui/resume reads no cookie, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: GET /ui/login arrives: sent by /oauth/authorize or the consent screen with return_to=/ui/resume/<handle>, or opened directly
- Find the realm of the host: the request has its realm
- Count the request against the global limit: the address is under its limit
- Check the query against the page's schema: the query matches the schema
- Read the login-CSRF cookie: the login-CSRF cookie cannot be decoded
|
Fail on a store error ends here | The host is the primary host of an enabled realm, the address is under its limit, the query or the form passes the route schema, the login-CSRF cookie decodes, the posted csrf_token matches it, and neither the address being signed in to nor the client address is locked out, the address has a password credential in this realm, its address confirmed, and its user is enabled, the posted password is the credential's, the realm's accounts.requireVerifiedAccount is on, the default (#528); REQUIRE_VERIFIED_ACCOUNT unset, blank or true seeds it so in a new realm, return_to is /ui/resume/<handle>, as /oauth/authorize and the consent screen send it, the handle names an authorization request parked less than ten minutes ago that no request has resumed yet, and the parked value is an /oauth/authorize URL | - Wait for a sign-in request: POST /ui/login arrives for a page this walk did not render
- Find the realm of the host: the request has its realm
- Count the request against the login limit: the address is under its limit
- Check the form against the login form schema: the form matches the schema
- Read the login-CSRF cookie: the cookie is absent or decodes
- Check the posted CSRF value against the cookie: the posted value is the cookie's
- Refuse a locked-out address, else count the attempt: the attempt is counted on the address being signed in to and on the client address
- Reserve the attempt on the account's failure ladder: the attempt is counted on the account's ladder, and the next wait set
- Check the password: it fails, because the database fails
|