Hand the sign-in flow a checked identity and its attributes ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the person signed in, and the answer passes every check of the method, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the provider sends the browser to the method's callback route, a GET under /upstream/<type>
- Compare the callback's binding with the pending transaction's, before taking it: the binding is the pending transaction's
- Take the pending transaction the flow cookie names: the transaction is taken and handed to the callback
- The method's callback checks the provider's answer: the callback hands a result to the engine, which passes it to verify()
- Turn the result into a VerifiedIdentity: the identity is checked and frozen, its assurance level lowered to the caller's ceiling: low unless the operator raised it for this provider, since an upstream sign-in ranks with a password
- Take the identity's attributes: every attribute's source is the method's type; the engine builds the list itself, so none is added
|
The person declined at the provider ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the person cancelled or declined at the provider (error=access_denied), the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the provider sends the browser to the method's callback route, a GET under /upstream/<type>
- Compare the callback's binding with the pending transaction's, before taking it: the binding is the pending transaction's
- Take the pending transaction the flow cookie names: the transaction is taken and handed to the callback
- The method's callback checks the provider's answer: the person declined at the provider
|
Refuse a callback that does not belong to a pending transaction ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, it carries another one, or none, an empty one or the parameter repeated: a response meant for another start, a forged one, or a cross-site request that would cancel the pending sign-in, the context is built and the handler answers, the person signed in, and the answer passes every check of the method, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the provider sends the browser to the method's callback route, a GET under /upstream/<type>
- Compare the callback's binding with the pending transaction's, before taking it: the binding is missing, empty, repeated or another start's: transaction_mismatch, and nothing is taken
|
The provider answered an error ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the provider answered another error, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the provider sends the browser to the method's callback route, a GET under /upstream/<type>
- Compare the callback's binding with the pending transaction's, before taking it: the binding is the pending transaction's
- Take the pending transaction the flow cookie names: the transaction is taken and handed to the callback
- The method's callback checks the provider's answer: the provider answered another error
|
The provider's answer failed a check ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the provider's answer fails a check: the code exchange, the ID token's signature, iss, aud or nonce, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the provider sends the browser to the method's callback route, a GET under /upstream/<type>
- Compare the callback's binding with the pending transaction's, before taking it: the binding is the pending transaction's
- Take the pending transaction the flow cookie names: the transaction is taken and handed to the callback
- The method's callback checks the provider's answer: the provider's answer fails a check
|
The provider could not be reached ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the provider cannot be reached in time, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the provider sends the browser to the method's callback route, a GET under /upstream/<type>
- Compare the callback's binding with the pending transaction's, before taking it: the binding is the pending transaction's
- Take the pending transaction the flow cookie names: the transaction is taken and handed to the callback
- The method's callback checks the provider's answer: the provider cannot be reached through the egress client
|
verify() refused the result ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the person signed in, and the answer passes every check of the method, the callback answers result, declined, or failed with a reason of the closed set, it rejects the result, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the provider sends the browser to the method's callback route, a GET under /upstream/<type>
- Compare the callback's binding with the pending transaction's, before taking it: the binding is the pending transaction's
- Take the pending transaction the flow cookie names: the transaction is taken and handed to the callback
- The method's callback checks the provider's answer: the callback hands a result to the engine, which passes it to verify()
- Turn the result into a VerifiedIdentity: verify() rejects the result; its rejection is kept for the log
|
The method could not start ends here | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the person signed in, and the answer passes every check of the method, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: it fails, because start() rejects, such as when the provider's discovery document cannot be read
|
The method broke the contract ends here | Anything else: an http redirect, credentials, a fragment, a transaction that is not JSON data or too big, a binding that is missing, short or outside base64url, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the person signed in, and the answer passes every check of the method, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the redirect, the transaction or the binding fails a check; the browser goes nowhere
|
The person did not come back user leaves the page | An https redirect with no credentials and no fragment, a transaction of JSON data within 4096 bytes, and a binding of 22 to 512 base64url characters, a GET to the callback, the answer in the query, the bounce names one of the method's own GET callback routes, with a plain object of strings as its query, the browser that started brings its flow cookie, and the transaction is still pending, the callback carries the pending transaction's binding, once, the context is built and the handler answers, the person signed in, and the answer passes every check of the method, the callback answers result, declined, or failed with a reason of the closed set, verify() resolves an externalSub of 1 to 255 characters of well-formed text with no control character, an assurance level and raw claims, every attribute's source is the method's type, with a key, a string value and a verified flag | - Offer the upstream step: the person picks a provider
- Ask the method to start an upstream transaction: start() answers
- Check what start() answered: the engine keeps a frozen copy of the transaction, with its binding, server-side, bound to the interaction and its flow cookie, and sends the browser to the redirect; the transaction never reaches the browser
- Wait while the person is at the provider: the person never comes back
|