"Pernah nggak, API kamu bisa diakses siapa saja tanpa login? Atau frontend sudah jadi, tapi bingung gimana cara login ke backend Laravel? Di sinilah Laravel Sanctum jadi solusi autentikasi API yang simpel dan powerful."
Kenapa Perlu Autentikasi API?
- Melindungi data dari akses sembarangan
- Wajib untuk aplikasi SPA, mobile, dan public API
- User harus login untuk akses data pribadi
Cara Kerja Sanctum (Token Based Auth)
Laravel Sanctum menggunakan token-based authentication. Artinya, setelah login, user akan mendapatkan token yang harus dikirim di setiap request API melalui header Authorization. Ini membuat API lebih aman dan mudah diintegrasikan dengan frontend atau mobile app.
Studi Kasus: API Artikel dengan Login
Di artikel ini, kita akan membuat API Artikel yang hanya bisa diakses user yang sudah login menggunakan Laravel Sanctum.
Step 1: Install Sanctum
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Command ini akan menambahkan tabel personal_access_tokens yang digunakan untuk menyimpan token API user.
Tambahkan middleware Sanctum di app/Http/Kernel.php pada group api:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
Step 2: Setup Model User
Pastikan model User pakai trait HasApiTokens:
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
// ...
}
Step 3: Membuat Endpoint Auth (Login, Register, Logout)
Buat controller misal AuthController:
php artisan make:controller Api/AuthController
Contoh fungsi register, login, dan logout:
public function register(Request $request) {
$validated = $request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6',
]);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => bcrypt($validated['password']),
]);
$token = $user->createToken('api-token')->plainTextToken;
return response()->json(['user' => $user, 'token' => $token], 201);
}
public function login(Request $request) {
$credentials = $request->only('email', 'password');
if (!auth()->attempt($credentials)) {
return response()->json(['message' => 'Unauthorized'], 401);
}
$user = auth()->user();
$user->tokens()->delete(); // hapus token lama, 1 user = 1 token aktif
$token = $user->createToken('api-token')->plainTextToken;
return response()->json(['user' => $user, 'token' => $token]);
}
public function logout(Request $request) {
$request->user()->currentAccessToken()->delete();
// Logout akan menghapus token aktif sehingga request berikutnya akan ditolak.
return response()->json(['message' => 'Logged out']);
}
Step 4: Route API Auth & Proteksi Artikel
Edit routes/api.php:
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->group(function() {
Route::post('logout', [AuthController::class, 'logout']);
Route::apiResource('articles', ArticleController::class);
});
Step 5: Testing API Auth dengan Postman
Register
POST /api/register
Content-Type: application/json
{
"name": "Atha",
"email": "atha@mail.com",
"password": "password123"
}
Login
POST /api/login
Content-Type: application/json
{
"email": "atha@mail.com",
"password": "password123"
}
Response:
{
"user": { "id": 1, "name": "Atha", ... },
"token": "1|longapitoken..."
}
Akses Artikel (dengan token)
Tambahkan header:
Authorization: Bearer 1|longapitoken...
GET /api/articles
Error Handling & Status Code
- 201 Created: Register sukses
- 200 OK: Login sukses, data diambil
- 401 Unauthorized: Token salah/expired
- 422 Unprocessable Entity: Validasi gagal
Common Mistake Pemula
- Lupa publish/migrate Sanctum
- Lupa tambahkan middleware
auth:sanctum - Token tidak dikirim di header
- Lupa set
Accept: application/json - Salah endpoint (POST login, bukan GET)
- Salah group route (harus di dalam middleware)
Next Step
- Refresh token
- Role/permission
- API Resource
- Testing dengan Thunder Client
🚀 Yuk Diskusi & Share!
Kalau kamu stuck di step tertentu, tulis di komentar ya! Share juga pengalaman kamu pakai Sanctum, atau request topik lanjutan (refresh token, role, dsb).
Referensi:
Top comments (0)