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
| Guard | Driver | Dipakai di | Middleware |
|---|---|---|---|
web | session | Halaman Inertia | auth, completed, loginlog |
api | JWT (tymon/jwt-auth) | Akses lintas-service — frontend pakai token ini untuk memanggil backend Go & microservice | auth:api |
| — | Sanctum | Mayoritas endpoint routes/api.php | auth:sanctum |
Alur JWT
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, logoutTitik penerbitan token
| Lokasi | Konteks |
|---|---|
AuthService.php:159, :188 | Login normal & SSO |
QuickLoginController.php:58 | Login-as-user (admin) |
WelcomeController.php:614 | Onboarding wizard |
routes/api.php:85 | POST /api/refresh — refresh token |
Refresh flow — services/axiosInstance.js
Wrapper axios ini sudah menangani JWT + refresh token otomatis dengan antrian request:
// 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
| Area | Lokasi |
|---|---|
JWT_SECRET, JWT_TTL, JWT_REFRESH_TTL | .env, config/jwt.php |
| Payload/claim token | Titik penerbitan di atas |
POST /api/refresh | routes/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):
| Route | File | Catatan |
|---|---|---|
POST /afEqVLZBoQyNVCkXpbtiWuNhiZYKaiLqYwFAP/{id} | routes/api.php:92 | Path acak sebagai pengaman |
POST /sFfsmkGVzExKomNGFQWpkEidsTeEhkam | routes/api.php:93 | Path acak, loginById |
SSO Google
Login via Google OAuth memakai laravel/socialite:
Auth/GoogleAuthController.php— callback GoogleGOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GOOGLE_REDIRECT_URIdi.env- Redirect URI:
${APP_URL}/sso/google/callback
Middleware auth
| File | Fungsi |
|---|---|
Authenticate.php | Auth guard standar |
CompleteaccountChecking.php | Blokir user yang belum selesaikan onboarding |
LoginlogChecking.php | Lacak sesi/device aktif |
PermissionChecking.php | RBAC berbasis role |
RedirectIfStoreOrWarehouseNotExisted.php | Pastikan store & warehouse ada |
Verifikasi JWT lokal
# Generate secret baru (akan menginvalidate semua token existing)
php artisan jwt:secret
# Cek token
php artisan tinker
>>> JWTAuth::parseToken()->authenticate();Langkah berikutnya
- Butuh panggil service lain? Baca External Services — peta URL service.
- Akan tulis query? Baca Multi-tenant —
store_idscoping.