# Alur Login

## Cek metode login yang aktif

```http
GET /api/auth/methods
```

Mengembalikan apakah email/password, Google, dan pendaftaran aktif, serta site key Cloudflare
Turnstile jika captcha diaktifkan (kirim hasilnya sebagai `turnstile_token`).

## Register

```http
POST /api/auth/register
{ "email": "budi@contoh.com", "password": "min-8-karakter", "name": "Budi", "referral_code": "opsional" }
```

- Jika verifikasi email aktif → `{ "verification_required": true, "email": "..." }`. User menerima email berisi kode 6 digit dan link.
- Jika tidak → langsung `{ "token": "<jwt>" }`.

## Verifikasi email

```http
POST /api/auth/verify-email
{ "email": "budi@contoh.com", "code": "123456" }      // dari kode
{ "token": "<token dari link email>" }                 // atau dari link
```

Respons `{ "verified": true, "token": "<jwt>" }` (user langsung masuk). Untuk akun dengan 2FA,
`token` tidak ada: lanjutkan dengan login biasa. Kirim ulang email: `POST /api/auth/resend-verification`.

## Login

```http
POST /api/auth/login
{ "email": "budi@contoh.com", "password": "..." }
```

Ada tiga kemungkinan respons:

| Respons | Langkah berikutnya |
|---|---|
| `{ "token": "..." }` | Selesai. Pakai sebagai `Authorization: Bearer`. |
| `{ "verification_required": true }` | Email belum diverifikasi. |
| `{ "mfa": { "token": "...", "setup": false } }` | Minta kode authenticator, kirim ke `/api/auth/mfa/verify`. |
| `{ "mfa": { "token": "...", "setup": true } }` | Admin yang belum punya 2FA: panggil `/api/auth/mfa/setup` dulu untuk QR code. |

```http
POST /api/auth/mfa/verify
{ "mfa_token": "<mfa.token>", "code": "123456" }
```

`code` boleh kode 6 digit atau salah satu recovery code. Respons `{ "token": "..." }`; saat enrolment
pertama juga berisi `recovery_codes` yang harus ditampilkan ke user sekali.

## Google sign-in

Arahkan browser ke `GET /api/auth/google/start`. Setelah login di Google, SumoRouter me-redirect ke
`{PUBLIC_URL}/auth/callback` dengan hasil di **fragment** URL:

- `#token=<jwt>`: berhasil.
- `#mfa=<mfa_token>&setup=<true|false>`: lanjutkan ke langkah 2FA di atas.
- `/login?error=<kode>`: gagal.

:::note
Karena redirect selalu ke `PUBLIC_URL` instance, Google sign-in di frontend dengan domain lain
butuh halaman `/auth/callback` di domain tersebut (self-host dengan `PUBLIC_URL` milikmu).
:::

## Lupa password

```http
POST /api/auth/forgot-password   { "email": "..." }
POST /api/auth/reset-password    { "token": "<dari link email>", "password": "..." }
```

Reset password tidak otomatis login dan mengakhiri semua sesi lama.
