Sign-in, accounts and sessions

Sign-in methods

MethodConfigure (web app)Email trusted for account linking
GitHubGITHUB_CLIENT_ID, GITHUB_CLIENT_SECRETNever (no email scope is requested)
GitLabGITLAB_OAUTH_CLIENT_ID, GITLAB_OAUTH_CLIENT_SECRET, optional GITLAB_OAUTH_URL; scope read_user; redirect URI <APP_URL>/api/auth/gitlab/callbackOnly confirmed gitlab.com accounts
GoogleGOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET; scopes openid email profile; redirect URI <APP_URL>/api/auth/google/callbackWhen Google reports email_verified
Email linkEMAIL_SIGN_IN=true on the web app, plus RESEND_API_KEY/EMAIL_FROM on ConvexAlways (clicking the link proves ownership)

Account linking

Sessions

Email invitations

Admins can invite by email (Settings → People). The link is single use, expires in 7 days and can be revoked. Whoever opens it signs in with any method and accepts. Only the token's hash is stored. GitHub-login invitations continue to work.

Migration

users.githubId is optional. Existing GitHub users get a github identity on their next sign-in. After deploying, you can also backfill all users at once:

npx convex run identity:backfillIdentities --prod

The backfill is idempotent and paginated.

SSO / SAML

SSO/SAML is deferred. When it is added, plan to front OpenReview with a self-hosted OIDC/SAML broker that exposes a standard OIDC provider, using the same identity and linking rules.