AUTHENTICATION METHODS · LAB
Follow the evidence in a real sign-in
Sign Ava in with an identifier and a password, then trace what the tenant verified, what it recorded, and what the sign-in did not establish.
ReadyUses your lab tenant
The lesson
New to the labs? Start with the lab toolkit and the shared cast and names every lab uses.
Your progress
Press Start before you begin. Only events your tenant records after that count, in the order below. Checking reads your tenant's Audit, so you need Audit read access in it.
Sign in to start this lab and check your progress. Log in or create an account.
Sign in with a wrong password and get a generic refusal
Recorded as
oauth.authorizerejected (invalid_credentials).Sign Ava in with her password
Recorded as
oauth.authorizesucceeded (user_signed_in) about[email protected].Finish the request and receive a code for Ava
Recorded as
oauth.authorizesucceeded (code_issued) about[email protected].The application redeems the code for Ava's tokens
Recorded as
oauth.tokensucceeded about[email protected].
Setup
This is the first lab of the authentication track. Later labs build on the users and settings you prepare here.
If your Lab Photos tenant holds leftovers from other experiments, reset it: in the tenant portal open Overview > Reset tenant and choose the Lab Photos preset. Audit and Logs are preserved by default. The preset creates Ava, Ben and Cora without passwords and the lab scopes.
Open Users and, for Ava, Ben and Cora, choose Set password. Give each a unique password from your password manager and keep them there. You type them into sign-in pages, never into the shell.
Open Authentication and confirm the default policy without changing it: Password Required, every other method Off, second step enrolled, role holders on.
Copy the issuer from Overview and keep it in your shell:
export ISSUER="https://tenant-<uuid>.beyondthelogin.dev"
btl-lab env
Open a private browser window for Ava. Each person in these labs gets their own private window or browser profile, because one browser holds one tenant session for every application.
Walkthrough
In Ava's window open
$ISSUER/token-decoderand start a sign-in with the scopesopenid profile email. The tenant's sign-in page asks for an email address and a password.
Why it matters: the email address is the identifier, the password is the credential, and the tenant is the verifier. The lesson's table of pieces maps onto this one page.
Enter
[email protected]and a wrong password. The page says only that the email or password is incorrect.
Why it matters: the identifier matched an account, but authentication did not succeed. The answer discloses nothing more about the account.
Enter
[email protected]with any password. Compare the message with step 2. It reads the same.
Why it matters: a sign-in page that answers differently for unknown addresses turns the identifier field into a way to test which accounts exist.
Sign in as Ava with her real password. The Token Decoder shows the ID token. Read
sub,auth_timeandamr, which is["pwd"].
Why it matters: amr names the evidence the tenant actually checked, a knowledge factor. It says nothing about who Ava is in the real world, which is identity proofing, not authentication.
In the same window open
$ISSUER/account. You are not asked for the password again.
Why it matters: the successful check created a session. Later pages rely on the session instead of asking for the password on every page.
Open
$ISSUER/managein the same window. The tenant sends Ava to/account.
Why it matters: authentication proved that this person controls Ava's account. It granted no management permission. Authorization is a separate decision, made on every request.
In the tenant portal open Audit and filter on the operation
oauth.authorize. Find the two rejected attempts with reasoninvalid_credentials, then Ava'suser_signed_inandcode_issued.
Why it matters: the tenant recorded each step of the evidence trail and never the password. The rejected attempts carry no subject: a typed email address is a claim, so the record does not attach it to an account.
Break it
The wrong password in step 2 and the unknown address in step 3 are the failure cases. Both are recorded as
oauth.authorizerejected with reasoninvalid_credentials, and both show the same message to the person at the keyboard. Nothing was weakened, so there is nothing to restore.
Check your work
Press Check my progress. The checks look for the rejected attempt, Ava's sign-in, the code and the token redemption, in that order.
Also confirm by hand:
Ava's ID token contains
"amr": ["pwd"]and anauth_time.Logs show the
/managerequest answered with reasonnot_permitted.
Cleanup
Nothing to remove. Ava, Ben and Cora keep their passwords for the rest of the track.