Skip to main content

Authentication

Onie Studio uses Supabase Auth with JWT tokens for all authenticated requests.

Auth Flow

  1. User signs in via email/password through the Supabase Auth client
  2. Supabase returns an access_token (JWT) and refresh_token
  3. All API requests include the JWT in the Authorization header
  4. The Edge Function validates the JWT and resolves the user's role

Making Authenticated Requests

Use the fetchWithAuth utility (defined in src/utils/sessionHelper.ts):

import { fetchWithAuth } from '@/utils/sessionHelper';

const response = await fetchWithAuth('/clients', {
method: 'GET',
});
const data = await response.json();

fetchWithAuth automatically:

  • Attaches the Authorization: Bearer {token} header
  • Handles 401 responses by refreshing the token and retrying
  • Applies exponential backoff on 503 errors

Token Refresh

The Supabase client handles token refresh automatically. If the access token expires, the SDK uses the refresh token to obtain a new one transparently.

Client Portal (Token-Based Access)

Clients accessing the portal via email link use a portal token — a one-time secure token embedded in the URL as a hash fragment (#portal=TOKEN). This mode:

  • Does not require a Supabase account or login
  • Is iframe-safe (no cookies or redirects)
  • Provides read access to the client's own data only

Session Roles

The user's role is determined at sign-in and stored in the Supabase user metadata. The frontend reads this to decide which view to render:

// From App.tsx
if (userRole === 'client') {
return <ClientPortal />;
}
return <CreativeDashboard />;