Sanctum 401 Unauthorized: Checklist Lengkap
Saat memakai Laravel Sanctum, error 401 Unauthorized biasanya berarti route yang kamu akses memang terlindungi, tetapi Laravel tidak berhasil mengenali user yang sedang login. Dari sisi developer, ini sering membingungkan karena login terlihat berhasil, token sudah ada, tetapi request berikutnya tetap dianggap guest.
Akar masalah Sanctum hampir selalu jatuh ke salah satu dari dua mode autentikasi yang tertukar: token API biasa atau SPA auth berbasis session/cookie. Kalau kamu mencampur dua mode ini tanpa konfigurasi yang tepat, 401 akan terus muncul.
Kapan Masalah Ini Biasanya Muncul?
- Request ke route
auth:sanctumselalu mendapat401 - Token sudah dibuat, tetapi endpoint
/api/usertetap mengembalikan guest - Aman di Postman, tetapi gagal di browser
- Login SPA sukses, tetapi request berikutnya tetap dianggap belum login
- User login, tetapi route dengan ability tertentu tetap ditolak
Penyebab Paling Umum
1. Header Authorization: Bearer ... Tidak Terkirim
Kalau kamu memakai personal access token, setiap request harus membawa header token yang benar.
2. Token yang Dipakai Bukan Token Terbaru atau Sudah Tidak Valid
Sering terjadi saat frontend masih menyimpan token lama di local storage atau environment.
3. Kamu Sebenarnya Sedang Membangun SPA Auth, Bukan Token Auth
Untuk SPA berbasis cookie/session, Sanctum butuh konfigurasi tambahan seperti:
- domain stateful
- CORS yang benar
- request CSRF cookie
- browser mengirim cookie ke backend
Kalau salah satu langkah ini terlewat, hasilnya sering 401 atau 419.
4. Route atau Guard Tidak Sesuai
Kadang route dipasang di file yang salah atau middleware lain ikut mengganggu alur autentikasi.
5. Token Ability Tidak Cocok
Kalau route mensyaratkan ability tertentu, token yang tidak punya ability itu akan ditolak.
Langkah Diagnosis
- Tentukan dulu mode yang kamu pakai:
- token API biasa
- SPA auth dengan cookie/session
- Uji endpoint sederhana seperti
/api/user. - Cek request headers di browser devtools atau Postman:
- apakah header
Authorizationada? - apakah cookie session ikut terkirim?
- apakah header
- Pastikan route target memang memakai
auth:sanctum. - Kalau memakai SPA, cek apakah endpoint
/sanctum/csrf-cookiesudah dipanggil sebelum login.
Kalau request datang dari mobile app, Postman, atau frontend terpisah, biasanya kamu butuh Bearer token. Kalau request datang dari SPA first-party, kamu biasanya butuh cookie + CSRF flow. Jangan campur keduanya.
Langkah Fix
1. Untuk Token API: Kirim Header dengan Benar
Contoh request:
2. Untuk Token API: Buat Token Setelah Login
3. Untuk SPA: Minta CSRF Cookie Lebih Dulu
Contoh flow frontend:
4. Pastikan Route Ditaruh di Tempat yang Tepat
- Endpoint login web biasanya ada di
routes/web.php - Endpoint API JSON biasanya ada di
routes/api.php
Yang penting bukan cuma filenya, tetapi guard dan flow autentikasinya konsisten.
5. Cek Ability Token Jika Dipakai
Kalau route butuh ability tertentu, token harus dibuat dengan ability yang sesuai.
Contoh Sebelum dan Sesudah
Sebelum
Request tidak membawa token maupun cookie, jadi Laravel membaca user sebagai guest.
Sesudah
Error Umum
Aman di Postman, Gagal di Browser
Biasanya flow SPA belum lengkap: cookie tidak ikut terkirim, domain stateful salah, atau CSRF belum diambil.
Token Ada, Tapi Tetap 401
Periksa apakah frontend masih memakai token lama, token salah copy, atau header Authorization tidak benar-benar terkirim.
Berubah Jadi 419 Page Expired
Ini biasanya tanda bahwa kamu sedang masuk ke flow session/cookie, tetapi konfigurasi CSRF atau session belum beres.
Pencegahan
- Putuskan sejak awal: token auth atau SPA auth.
- Uji endpoint
/api/usersetiap kali setup auth berubah. - Pastikan frontend selalu mengirim
Accept: application/json. - Jangan mencampur penyimpanan token lama dan baru.
- Dokumentasikan flow login yang dipakai tim agar tidak tertukar.
Bacaan Terkait
- Laravel API
- Otentikasi Laravel
- Middleware
- CSRF Token Mismatch di Laravel: Penyebab dan Solusi
- Cara Mengatasi 419 Page Expired di Laravel
FAQ
Kenapa login berhasil, tetapi /api/user tetap 401?
Karena request lanjutan kemungkinan tidak membawa bukti autentikasi yang benar: token Bearer atau cookie session.
Apakah Sanctum hanya untuk SPA?
Tidak. Sanctum bisa dipakai untuk dua skenario: personal access token dan SPA auth first-party.
Kapan saya harus curiga ke CORS atau cookie?
Kalau request aman di Postman, tetapi gagal di browser, itu sinyal kuat bahwa masalahnya ada di cookie, domain stateful, atau CORS.