Tutorial membuat RESTful API Token Authentication di Laravel 13 menggunakan Laravel Sanctum. Siap dipakai untuk React, Next.js, & Mobile!
Saat membangun aplikasi web modern dengan arsitektur terpisah (decoupled architecture)—seperti menggunakan Laravel 13 sebagai Backend API dan Next.js, React, atau Flutter sebagai Frontend—sistem login berbasis Session/Cookie biasa tidak lagi efisien.
Kita membutuhkan Token-Based Authentication. Di ekosistem Laravel, paket resmi yang paling ringan, aman, dan mudah digunakan untuk kebutuhan ini adalah Laravel Sanctum.
Artikel ini akan membimbingmu membangun API Endpoint untuk Register, Login, Logout, dan Proteksi Route berbasis Bearer Token.
1. Persiapan & Instalasi Sanctum
Sejak Laravel versi terbaru, paket Laravel Sanctum sudah terpasang secara bawaan. Namun jika kamu memulai dari proyek clean install, pastikan Sanctum aktif dengan menjalankan perintah:
Bash
php artisan install:api
Perintah di atas otomatis akan:
Mempublikasikan file konfigurasi
config/sanctum.php.Menjalankan migrasi untuk tabel
personal_access_tokens.Memastikan trait
HasApiTokensterpasang pada modelUser.
Buka model app/Models/User.php dan pastikan trait HasApiTokens sudah di-import:
PHP
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens; // 1. Import Trait
class User extends Authenticatable
{
use HasApiTokens, Notifiable; // 2. Gunakan Trait
protected $fillable = [
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
}
2. Membuat AuthController untuk API
Buat controller baru khusus penanganan API Authentication:
Bash
php artisan make:controller Api/AuthController
Buka app/Http/Controllers/Api/AuthController.php dan tulis logika untuk Register, Login, dan Logout:
PHP
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class AuthController extends Controller
{
// 1. ENDPOINT REGISTER
public function register(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
// Buat Token Akses
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'message' => 'Registrasi berhasil',
'data' => $user,
'access_token' => $token,
'token_type' => 'Bearer',
], 201);
}
// 2. ENDPOINT LOGIN
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
$user = User::where('email', $request->email)->first();
// Validasi Kredensial
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['Kredensial yang diberikan tidak cocok.'],
]);
}
// Hapus token lama jika ingin membatasi 1 sesi saja (Opsional)
// $user->tokens()->delete();
$token = $user->createToken('auth_token')->plainTextToken;
return response()->json([
'message' => 'Login berhasil',
'access_token' => $token,
'token_type' => 'Bearer',
]);
}
// 3. ENDPOINT LOGOUT (Mencabut Token)
public function logout(Request $request)
{
// Hapus token yang sedang digunakan saat request
$request->user()->currentAccessToken()->delete();
return response()->json([
'message' => 'Berhasil logout dan token dicabut',
]);
}
}
3. Menghubungkan Route API
Buka file routes/api.php dan daftarkan endpoint publik serta endpoint yang dilindungi oleh middleware Sanctum:
PHP
use App\Http\Controllers\Api\AuthController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
// Route Publik (Bisa diakses tanpa token)
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
// Route Terproteksi (Wajib Mengirimkan Bearer Token)
Route::middleware('auth:sanctum')->group(function () {
// Ambil Profil User yang Sedang Login
Route::get('/user', function (Request $request) {
return $request->user();
});
// Logout
Route::post('/logout', [AuthController::class, 'logout']);
});
4. Cara Pengujian Menggunakan Postman / Insomnia
Saat melakukan panggilan HTTP ke route yang dilindungi middleware Sanctum (/api/user atau /api/logout), sertakan token di bagian Headers HTTP request:
HTTP
Authorization: Bearer 1|laravel_sanctum_token_karakter_acak_disini
Accept: application/json
┌─────────────────────────────────────────────────────────────────────────┐
│ ALUR AUTHENTICATION SANCTUM │
├────────────────────────────────┬────────────────────────────────────────┤
│ Request Login / Register │ Akses Protected Endpoint (`/api/user`) │
├────────────────────────────────┼────────────────────────────────────────┤
│ 1. Kirim email & password │ 1. Header: `Authorization: Bearer ...` │
│ 2. Server validasi data │ 2. Sanctum mencocokkan token di DB │
│ 3. Server kirim `plainTextToken`│ 3. Mengembalikan data JSON user │
└────────────────────────────────┴────────────────────────────────────────┘
Kesimpulan
Menggunakan Laravel Sanctum pada Laravel 13 memberikan kemudahan luar biasa untuk mengamankan komunikasi data antara backend API dan frontend modern (Next.js/React/Mobile Apps). Sistem token ini sangat aman, ringan, dan tidak memerlukan konfigurasi server OAuth2 yang rumit seperti Laravel Passport.
Ditulis oleh
Egi Samsul Mu'arif
Web & Mobile Developer



