D
Engineering

Auth & JWT

Tiga mekanisme autentikasi paralel. JWT yang diterbitkan dazoapp adalah kredensial lintas-service — bukan auth internal.

dazoapp punya tiga mekanisme autentikasi yang berjalan bersamaan. JWT di sini bukan sekadar auth API internal — ia adalah tiket akses ke seluruh ekosistem service.

Tiga guard

GuardDriverDipakai diMiddleware
websessionHalaman Inertiaauth, completed, loginlog
apiJWT (tymon/jwt-auth)Akses lintas-service — frontend pakai token ini untuk memanggil backend Go & microserviceauth:api
SanctumMayoritas endpoint routes/api.phpauth:sanctum

Alur JWT

text
1. User login
   → dazoapp menerbitkan JWT (JWTAuth::fromUser($user))

2. Token dikirim ke frontend
   → disimpan di localStorage['access_token']

3. Frontend memakai token untuk memanggil:
   ├─ dazoapp API (auth:sanctum + Bearer)
   ├─ Backend Go (url_api /v1/) dengan Bearer <jwt>
   ├─ Engine WhatsApp (url_engine) dengan Bearer <jwt>
   └─ Engine Bot (url_ai_agent) dengan Bearer <jwt>

4. Saat 401 dari service mana pun
   → services/axiosInstance.js otomatis refresh via POST /api/refresh
   → mengulang request yang tertunda
   → jika refresh gagal, logout

Titik penerbitan token

LokasiKonteks
AuthService.php:159, :188Login normal & SSO
QuickLoginController.php:58Login-as-user (admin)
WelcomeController.php:614Onboarding wizard
routes/api.php:85POST /api/refresh — refresh token

Refresh flow — services/axiosInstance.js

Wrapper axios ini sudah menangani JWT + refresh token otomatis dengan antrian request:

js
// Request: lampirkan Bearer dari localStorage
config.headers.Authorization = `Bearer ${localStorage.getItem('access_token')}`;

// Response 401: single-flight refresh
// - isRefreshing flag mencegah loop
// - failedQueue antriin request yang tertunda
// - sukses: simpan token baru, ulang semua request
// - gagal: localStorage.clear() + router.post('/logout')

Yang TIDAK boleh diubah tanpa koordinasi lintas repo

AreaLokasi
JWT_SECRET, JWT_TTL, JWT_REFRESH_TTL.env, config/jwt.php
Payload/claim tokenTitik penerbitan di atas
POST /api/refreshroutes/api.php:85
Struktur response { access_token, token_type, expires_in }AuthService.php:159/:188, QuickLoginController.php:58, WelcomeController.php:614

Jika tugas menuntut perubahan di area ini, katakan bahwa itu butuh koordinasi lintas repo — backend Go, engine WhatsApp, engine bot, cron, dan worker bergantung padanya.

Login-as-user (admin)

Ada 2 route untuk login sebagai user lain (admin/debug):

RouteFileCatatan
POST /afEqVLZBoQyNVCkXpbtiWuNhiZYKaiLqYwFAP/{id}routes/api.php:92Path acak sebagai pengaman
POST /sFfsmkGVzExKomNGFQWpkEidsTeEhkamroutes/api.php:93Path acak, loginById

SSO Google

Login via Google OAuth memakai laravel/socialite:

  • Auth/GoogleAuthController.php — callback Google
  • GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URI di .env
  • Redirect URI: ${APP_URL}/sso/google/callback

Middleware auth

FileFungsi
Authenticate.phpAuth guard standar
CompleteaccountChecking.phpBlokir user yang belum selesaikan onboarding
LoginlogChecking.phpLacak sesi/device aktif
PermissionChecking.phpRBAC berbasis role
RedirectIfStoreOrWarehouseNotExisted.phpPastikan store & warehouse ada

Verifikasi JWT lokal

bash
# Generate secret baru (akan menginvalidate semua token existing)
php artisan jwt:secret

# Cek token
php artisan tinker
>>> JWTAuth::parseToken()->authenticate();

Langkah berikutnya