Skip to main content
EVO Dialed uses Better Auth for authentication, with the Rails backend validating JWT tokens.

Authentication flow

Better Auth

Better Auth handles:
  • Magic link email login
  • Password authentication
  • Google OAuth
  • Apple Sign-In
  • Session management
  • JWT token issuance

Sign-in methods

User sync

When a user authenticates, Better Auth syncs to Rails via:

JWT validation

The Rails backend validates JWT tokens in requests.

JwtAuthenticatable concern

File: app/controllers/concerns/jwt_authenticatable.rb

User types

Requiring admin access

User identity

Critical: user_id across ~46 tables is a Better Auth ID (string, 64 chars), NOT users.id. Always join via users.auth_user_id.

Correct joins

Foreign key pattern

Tables reference users via Better Auth ID:

iOS authentication

The iOS app uses cookies and tokens:

Token refresh

  • Tokens cached in TokenStore (UserDefaults)
  • Auto-refresh when token expires (60s margin)
  • 401 responses trigger forced refresh + retry

Session security

Better Auth sessions use secure cookies:
  • HttpOnly - Not accessible to JavaScript
  • Secure - HTTPS only in production
  • SameSite=Lax - CSRF protection

Token expiration

  • Access tokens: Short-lived (1 hour)
  • Refresh tokens: Long-lived (30 days)
  • Session: Extended on activity

Error handling

Testing authentication