Authentication Flow
This document describes the authentication architecture for Traceo.Overview
Traceo uses Supabase Auth for authentication across all services:- Web Client: OAuth (Google, GitHub) and email/password login
- MCP Server: JWT validation middleware
- Engine: JWT validation middleware
Architecture
Web Client Authentication
Environment Variables
Auth Flow
-
Login (
/login):- User clicks OAuth provider (Google/GitHub) or enters email/password
- Supabase handles OAuth redirect flow
- On success, redirects to
/callback
-
Callback (
/callback):- Exchanges auth code for session
- Checks if user needs onboarding (no workspace)
- Redirects to
/onboardingor/sessions
-
Middleware (
src/middleware.ts):- Protects all routes except public paths
- Refreshes session if expired
- Redirects unauthenticated users to
/login
Usage in Components
Getting Access Token for API Calls
MCP Server Authentication
Environment Variables
Installation
Middleware Usage
Role-Based Access
User Context
Engine Authentication
Same pattern as MCP Server:JWT Structure
Supabase JWTs contain:Role Hierarchy
| Role | Level | Permissions |
|---|---|---|
| viewer | 0 | Read requirements |
| editor | 1 | Create/update requirements |
| admin | 2 | Delete requirements, view audit logs, manage settings |
| owner | 3 | All permissions, manage users |
Security Considerations
- JWT Secret: Keep
SUPABASE_JWT_SECRETsecure and never commit to git - Token Expiry: Access tokens expire in 1 hour by default
- Session Refresh: Web middleware auto-refreshes expired sessions
- RLS: Database Row Level Security uses JWT claims for tenant isolation
Troubleshooting
”JWT secret not found”
EnsureSUPABASE_JWT_SECRET environment variable is set. Get it from:
Supabase Dashboard → Settings → API → JWT Secret
”Token expired”
The web middleware should auto-refresh. If issues persist:- Check browser cookies aren’t blocked
- Clear cookies and re-login
- Verify Supabase project is active
”Invalid signature”
- Verify JWT secret matches Supabase project
- Ensure token wasn’t modified in transit
- Check for encoding issues (Base64 vs raw)