Sign-up
- User submits email + password.
- Server creates user row, sends verification email.
- User clicks verification link.
- Account marked verified; user redirected to onboarding.
Sign-in (password)
- User submits email + password.
- Server compares hashed password.
- On match: create session, set HTTP-only cookie.
- Redirect to app.
Sign-in (magic link)
- User submits email.
- Server generates a one-time token (15-min TTL), sends email.
- User clicks link → server verifies token → creates session.
Password reset
- User submits email on “Forgot?” page.
- Server generates a reset token (1-hour TTL), sends email.
- User clicks link → enters new password → server updates and invalidates token.
MFA setup
- User opens MFA setup in settings.
- Server generates a TOTP secret, returns QR code.
- User scans with authenticator app, enters first 6-digit code.
- Server verifies, marks MFA enabled.
- Subsequent sign-ins require code in addition to password.
OAuth
- User clicks “Sign in with Google”.
- Redirect to Google OAuth.
- Google redirects back with code.
- Server exchanges code for token, fetches profile.
- Match by email to existing user OR create new.
- Create session.
Session management
- Sessions are server-side, stored in Convex.
- Cookie is HTTP-only, SameSite=Lax, Secure in production.
- Default TTL: 30 days, sliding (renews on activity).
- Revoke: Workspace settings → Sessions, or programmatically via
auth.revoke(sessionId).
Account deletion
- User confirms (modal: “type your email”).
- Server marks user
deletedAt, soft-deletes owned data per cascade rules. - Hard-delete after 30 days (allows recovery if requested).
Related
Built-in auth
The high-level overview.
OAuth providers
Setup per provider.
Security
Best practices.
