Skip to main content

Every refused callback lands on `/login` with its reason; other errors (database) stay errors.

GET 

/api/v1/auth/oidc/callback

Every refused callback lands on /login with its reason; other errors (database) stay errors.

Request​

Responses​

Session established (bound as for localLogin); redirect to return_to, or to /choose when the session is bound to nothing yet. Without email_verified: true in the ID token when a verified address is required (service mode, auth.require_verified_email): no session, redirect to /verify-email.

Any other refused login opens no session and redirects to /login?error=<code>; the state is spent either way:

CodeReason
oidc_expiredUnknown or expired state (10 min): the sign-in took too long or was started in another browser.
oidc_refusedThe identity provider answered with error (e.g. access_denied).
oidc_failedNo code, the code exchange or the ID token's validation failed, or OIDC is not configured.
account_disabledThe user or their membership is disabled, or (self-hosted) the user is neither a member of an active installation tenant nor a platform admin.