Trusted browsers
"Remember this device" — skip the MFA challenge on a remembered device.
How it works
After a successful MFA challenge, the client may call
POST /v1/auth/trusted-browsers. The SDK:
- Mints a 32-byte random token.
- Stores
SHA-256(token + ":" + User-Agent)intrusted_browsers. - Sets an
identsphere_trustcookie with the raw token, scoped toroute_prefix,HttpOnly, 30-day TTL.
On the NEXT password login from the same browser, the login handler:
- Extracts the
identsphere_trustcookie value. - Computes the same hash with the request's User-Agent.
- If a matching, unrevoked, unexpired row exists → skip the MFA challenge.
- The session is issued at AAL2 (
auth_method: "password_with_mfa"). last_seen_aton the trusted-browser row is updated.
Why bind to User-Agent
A leaked cookie alone shouldn't bypass MFA. The User-Agent binding makes the cookie useless in any browser that doesn't match the original — best-effort "different device" detection without requiring full client attestation.
Management
| Endpoint | Purpose |
|---|---|
POST /v1/auth/trusted-browsers | Mark current browser trusted |
GET /v1/auth/trusted-browsers | List my trusted browsers |
DELETE /v1/auth/trusted-browsers/:id | Revoke a specific entry |
A user with stolen cookies can revoke all entries via the list UI to re-impose the MFA requirement on every device.
TTL
30 days, hardcoded in v0.1. The cookie's lifetime and the database row's
expires_at match.
Audit
auth.trusted_browser.addedon creation.auth.trusted_browser.revokedon revocation.auth.loginmetadata includestrusted_browser_idwhen the short-circuit fires.
What this is NOT
This is NOT "remember me" for password-only logins. The identsphere_trust
cookie only matters when the user has MFA enrolled. For
non-MFA accounts the cookie is silently ignored.
This is also NOT a DPoP or hardware-attestation flow. The cookie is a bearer token bound only by HTTP context (User-Agent + path scope).
Disabling
Trusted browsers can't be disabled per-deployment in v0.1; it's an
opt-in flow client-side. If you don't call
POST /v1/auth/trusted-browsers, the feature is invisible to the user.