Autentikasi memakai Better Auth dengan email/password. Session disimpan di Postgres; di production cookie secure + CSRF protection.
Stack auth
Kode: apps/api/src/auth/better-auth.ts, auth.middleware.ts, roles.ts
Peran
| Role di DB | Dinormalisasi | Akses |
|---|
admin | admin | /admin/*, semua operasi admin |
user atau kosong | peserta | Workspace, kelas, AI hub |
| lainnya | ditolak | 403 Forbidden |
Middleware requireRole(['admin']) atau requireRole(['peserta']) dipasang per route.
Frontend: AdminRoute vs UserRoute di apps/web/src/routes/.
Flow login biasa
Auto-login setelah pembayaran
Saat peserta bayar lewat Scalev, mereka belum punya session. Flow claim membuat session otomatis:
Field terkait: payment_sessions.sign_in_token, sign_in_token_expiry.
Kalau token gagal/expired, UI fallback ke login manual (requiresLogin: true).
Registrasi publik
POST /api/payment/register (dari /register/:batchSlug/:tierSlug):
- Validasi batch
open + tier aktif
- Provision user Better Auth (email + password)
- Buat
peserta + enrollment pending
- Buat
payment_session + order Scalev
Bearer token
Plugin bearer() aktif — API menerima Authorization: Bearer <token> untuk client non-browser.
Token tidak dibaca dari query string (dihapus untuk keamanan — hindari kebocoran via log/referrer).
Email terkait auth
| Event | Provider |
|---|
| Reset password | Resend (jika RESEND_API_KEY set) |
| Verifikasi email | Resend (opsional) |
| Invite peserta admin | email.service.ts templates |
Env
BETTER_AUTH_SECRET=... # min 32 char
BETTER_AUTH_URL=https://app.../api/auth
FRONTEND_URL=https://app...
Halaman terkait