Authentication Flow for Frontend - Lumina-Enterprise-Solutions/prism-auth-service GitHub Wiki
🔑 Authentication Flow for Frontend
Dokumen ini menjelaskan alur kerja (flow) lengkap untuk menangani otentikasi di sisi klien (frontend) yang berinteraksi dengan prism-auth-service
.
Konsep Dasar: Access Token & Refresh Token
Sistem ini menggunakan dua jenis token (JWT) untuk keamanan:
-
Access Token (
accessToken
):- Masa Berlaku: Sangat singkat (default 15 menit).
- Penggunaan: Digunakan di
Authorization
header untuk setiap permintaan ke endpoint yang terproteksi. - Penyimpanan: Sebaiknya disimpan di memori aplikasi (misalnya, state management seperti Redux, Zustand, Pinia, atau context React). Jangan disimpan di
localStorage
karena rentan terhadap serangan XSS.
-
Refresh Token (
refreshToken
):- Masa Berlaku: Jauh lebih lama (default 7 hari).
- Penggunaan: Hanya digunakan untuk meminta
accessToken
baru ketika yang lama sudah kedaluwarsa. - Penyimpanan: Bisa disimpan di
localStorage
atau lebih aman lagi di cookieHttpOnly
.
Diagram Alur Login dan Refresh Token
Berikut adalah visualisasi alur standar saat pengguna login dan sesi mereka tetap aktif.
sequenceDiagram
participant Client as Frontend
participant Server as Backend
rect rgb(230, 240, 255)
note over Client, Server: 1. Proses Login Awal
Client->>Server: POST /auth/login (email, password)
Server->>Client: 200 OK (accessToken, refreshToken)
note over Client: Simpan kedua token.
end
rect rgb(230, 255, 230)
note over Client, Server: 2. Permintaan API Normal (Menggunakan Access Token)
Client->>Server: GET /api/data (Header: Authorization: Bearer accessToken)
Server->>Client: 200 OK (Data yang diminta)
end
rect rgb(255, 255, 220)
note over Client, Server: 3. Access Token Kedaluwarsa
Client->>Server: GET /api/data (Header: Authorization: Bearer accessTokenLama)
Server->>Client: 401 Unauthorized (Token expired)
end
rect rgb(255, 230, 230)
note over Client, Server: 4. Proses Refresh Token
note over Client: Mendeteksi error 401.
Client->>Server: POST /auth/refresh (refreshToken)
Server->>Client: 200 OK (accessTokenBaru, refreshTokenBaru)
note over Client: Ganti token lama dengan yang baru.
end
rect rgb(230, 255, 230)
note over Client, Server: 5. Mengulang Permintaan yang Gagal
Client->>Server: GET /api/data (Header: Authorization: Bearer accessTokenBaru)
Server->>Client: 200 OK (Data yang diminta)
end
Alur-Alur Autentikasi
Alur 1: Registrasi Pengguna Baru
Pengguna membuat akun baru dengan email dan password.
- Aksi: Frontend mengirim data registrasi pengguna.
- Endpoint:
POST /auth/register
- Request Body:
{ "email": "[email protected]", "password": "passwordKuat123!", "first_name": "User", "last_name": "Baru" }
- Response Sukses (
201 Created
):{ "message": "User created successfully", "userId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
- Tindakan Frontend:
- Tampilkan pesan sukses kepada pengguna.
- Arahkan pengguna ke halaman login.
Alur 2: Login Standar (Tanpa 2FA)
Pengguna login dan langsung mendapatkan token karena 2FA tidak aktif.
- Aksi: Frontend mengirim kredensial login.
- Endpoint:
POST /auth/login
- Request Body:
{ "email": "[email protected]", "password": "passwordKuat123!" }
- Response Sukses (
200 OK
):{ "is_2fa_required": false, "auth_tokens": { "access_token": "eyJhbGciOiJI...", "refresh_token": "eyJsdfsdf..." } }
- Tindakan Frontend:
- Simpan
access_token
danrefresh_token
. - Arahkan pengguna ke halaman utama/dashboard.
- Mulai gunakan
access_token
untuk permintaan API yang terproteksi.
- Simpan
Alur 3: Login dengan Two-Factor Authentication (2FA)
Login ini memerlukan dua langkah: verifikasi password, lalu verifikasi kode TOTP.
Langkah 1: Verifikasi Password
- Aksi: Frontend mengirim kredensial login.
- Endpoint:
POST /auth/login
- Request Body:
{ "email": "[email protected]", "password": "passwordKuat123!" }
- Response Sukses (
200 OK
):{ "is_2fa_required": true, "auth_tokens": null }
- Tindakan Frontend:
- Jangan simpan token apa pun.
- Tampilkan form untuk memasukkan 6 digit kode 2FA.
Langkah 2: Verifikasi Kode 2FA
- Aksi: Frontend mengirim email dan kode 2FA yang diinput pengguna.
- Endpoint:
POST /auth/login/2fa
- Request Body:
{ "email": "[email protected]", "code": "123456" }
- Response Sukses (
200 OK
):{ "access_token": "eyJhbGciOiJI...", "refresh_token": "eyJsdfsdf..." }
- Tindakan Frontend:
- Sekarang simpan
access_token
danrefresh_token
. - Arahkan pengguna ke halaman utama/dashboard.
- Sekarang simpan
Alur 4: Menggunakan Access Token
Setelah login berhasil, setiap permintaan ke endpoint yang terproteksi wajib menyertakan accessToken
.
- Aksi: Frontend membuat permintaan ke API yang aman.
- Header:
Authorization
- Contoh:
GET /api/v1/profile Authorization: Bearer eyJhbGciOiJIUzI1NiIsIn...
Alur 5: Memperbarui Access Token (Refresh Flow)
Ini adalah alur paling penting untuk menjaga sesi pengguna tetap aktif.
- Kondisi: Permintaan API menggunakan
accessToken
gagal dengan status401 Unauthorized
. - Tindakan Frontend (Otomatis):
- Secara transparan (tanpa sepengetahuan pengguna), kirim permintaan untuk token baru.
- Endpoint:
POST /auth/refresh
- Request Body:
{ "refresh_token": "token-refresh-yang-disimpan-sebelumnya" }
- Response Sukses (
200 OK
):{ "access_token": "accessTokenBARU...", "refresh_token": "refreshTokenBARU..." }
- Aksi Lanjutan:
a. Perbarui
accessToken
danrefreshToken
yang disimpan dengan yang baru. b. Ulangi (retry) permintaan API yang tadi gagal, kali ini menggunakanaccessTokenBARU
.
- Kondisi Gagal: Jika permintaan ke
/auth/refresh
itu sendiri gagal (misalnya,refreshToken
juga sudah kedaluwarsa dan server merespons401 Unauthorized
):- Tindakan Frontend: Hapus semua token dan data sesi dari penyimpanan. Arahkan pengguna kembali ke halaman login. Sesi mereka telah berakhir.
💡 Tips Implementasi: Alur refresh token ini paling baik diimplementasikan menggunakan interceptor pada library HTTP client Anda (seperti Axios atau
fetch
wrapper). Interceptor akan menangani logika401
->refresh
->retry
secara otomatis untuk semua permintaan API.
Alur 6: Lupa Password
Pengguna meminta untuk mereset password mereka.
Langkah 1: Meminta Link Reset
- Aksi: Pengguna memasukkan email mereka di halaman "Lupa Password".
- Endpoint:
POST /auth/forgot-password
- Request Body:
{ "email": "[email protected]" }
- Response Sukses (
200 OK
):{ "message": "If an account with that email exists, a password reset link has been sent." }
- Tindakan Frontend: Tampilkan pesan tersebut kepada pengguna.
Langkah 2: Menggunakan Link Reset
- Aksi: Pengguna mengklik link di email mereka dan diarahkan ke halaman reset password di aplikasi Anda. URL-nya akan terlihat seperti:
https://aplikasianda.com/reset-password?token=xxxxxxxxxx
- Tindakan Frontend:
- Ambil
token
dari parameter URL. - Tampilkan form untuk memasukkan password baru.
- Ambil
Langkah 3: Mengirim Password Baru
- Aksi: Pengguna mengirimkan token dan password baru mereka.
- Endpoint:
POST /auth/reset-password
- Request Body:
{ "token": "token-dari-url-tadi", "new_password": "passwordBaruSuperAman123!" }
- Response Sukses (
200 OK
):{ "message": "Password has been reset successfully." }
- Tindakan Frontend: Tampilkan pesan sukses dan arahkan pengguna ke halaman login.