AUTH4D-215 Enterprise SSO on device approval and guest upgrades

Enterprise SSO can now sign a user into the hosted device approval page and link an SSO identity to a guest account. The user’s email address is used only in the hosted page to select a connection; only the domain is sent to auth4.dev.

Device approval

When GET /device/verify returns decision: "login_required", login_methods.sso is present and true when the tenant has an enabled connection with a routed domain. The page offers “Continue with single sign-on” and asks for a work email address.

The page starts SSO with the existing device sign-in flow:

GET /t/{tenantId}/sso/start?client_id={clientId}&browser_flow_id={flowId}&flow_kind=device&domain={domain}

flow_kind=device is accepted only for a live, tenant- and client-bound device sign-in flow and its browser-flow cookie. On success, the SSO callback returns to /login/device with a one-time proof_id and proof_purpose=sso_login. The page passes that proof to POST /device/sign-in/resume, which creates a browser session and returns the pending user code. The user still reviews the application, scopes and code, then explicitly approves or denies the device. SSO does not approve the device by itself.

Guest upgrades

The hosted guest upgrade page offers single sign-on alongside email and social identities when the tenant has an enabled connection with a routed domain. The browser upgrade and native upgrade-intent flows each bind a short-lived server-side marker to their existing guest-linking intent and browser cookie before starting SSO:

GET /t/{tenantId}/sso/start?client_id={clientId}&browser_flow_id={flowId}&flow_kind=guest_upgrade&domain={domain}

flow_kind=guest_upgrade requires that server-side marker and the matching hosted-login flow. The callback returns to /login/upgrade with a one-time SSO proof (or a fixed error code). The page asks the user to confirm linking before it completes the browser upgrade or native upgrade intent. An existing account is never merged into the guest; an SSO identity already owned by another user returns identity_in_use.

The default SSO start mode remains the browser authorization flow described in AUTH4D-148 (repository file docs/api-spec/auth4d-148.md). Device and guest-linking modes cannot be selected with an ordinary authorization flow, and tenant, client, flow and cookie bindings are checked again at the callback and proof-consumption steps.

Source: docs/api-spec/auth4d-215.md