Laravel

Panduan Lengkap Laravel Sanctum

06 Jun 2026 Administrator
Header Hero

Panduan Lengkap Laravel Sanctum

Sistem Autentikasi API, Mobile Apps, dan SPA pada Framework Laravel

Dalam pengembangan aplikasi web modern, pemisahan antara arsitektur backend dan frontend telah menjadi standar industri yang sangat populer. Pola pengembangan seperti *Single Page Applications* (SPA) menggunakan React, Vue.js, atau Angular, serta aplikasi mobile (Android & iOS) menuntut adanya mekanisme pertukaran data yang cepat, ringan, dan aman. Framework Laravel menjawab tantangan ini dengan menyediakan komponen autentikasi bawaan yang tangguh, salah satunya adalah Laravel Sanctum.

Laravel Sanctum memberikan solusi sistem autentikasi kelas ringan untuk SPA, aplikasi seluler, dan API berbasis token sederhana. Tidak seperti sistem autentikasi tradisional yang sangat bergantung pada *session* dan *cookies* stateful, Sanctum memanfaatkan teknologi *Personal Access Tokens*. Setiap platform klien yang melakukan *request* akan divalidasi melalui string token unik terenkripsi. Keunggulan utama dari pendekatan token-based ini adalah fleksibilitasnya, di mana token dapat dengan mudah dicabut (*revoked*), dibatasi masa aktifnya, atau dikelola secara mandiri oleh pengguna dari berbagai perangkat yang berbeda.

Catatan Arsitektur: Sanctum sangat cocok untuk proyek skala kecil hingga menengah yang membutuhkan sistem otentikasi API cepat tanpa kompleksitas berlebih seperti pada OAuth2 (Laravel Passport).

1. Instalasi dan Konfigurasi Awal

Jalankan perintah Composer berikut di dalam direktori proyek Laravel Anda untuk memasang paket Sanctum:

composer require laravel/sanctum

Setelah paket terpasang, rilis berkas konfigurasi bawaan dan jalankan migrasi database untuk membuat tabel penyimpanan token:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Langkah 2

Mengonfigurasi Model User

Tambahkan trait HasApiTokens ke dalam file model User Anda agar dapat memanggil fungsi pembuatan token:

// app/Models/User.php
namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
    
    // ... properti lainnya
}
Langkah 3

Membuat Auth Controller

Gunakan perintah berikut untuk men-generate AuthController untuk API:

php artisan make:controller API/AuthController --api

Isi app/Http/Controllers/API/AuthController.php dengan logika register, login, dan logout berikut:

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\Support\Facades\Auth;
use Illuminate\Http\JsonResponse;

class AuthController extends Controller
{
    public function register(Request $request): JsonResponse
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'success' => true,
            'user' => $user,
            'token' => $token,
            'token_type' => 'Bearer',
        ], 201);
    }

    public function login(Request $request): JsonResponse
    {
        $credentials = $request->validate([
            'email' => 'required|email',
            'password' => 'required|string',
        ]);

        if (!Auth::attempt($credentials)) {
            return response()->json(['success' => false, 'message' => 'Invalid credentials'], 401);
        }

        $user = Auth::user();
        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'success' => true,
            'token' => $token,
            'token_type' => 'Bearer',
        ]);
    }

    public function logout(Request $request): JsonResponse
    {
        $request->user()->currentAccessToken()->delete();
        return response()->json(['success' => true, 'message' => 'Successfully logged out']);
    }
}

2. Proteksi Route API

Buka file routes/api.php untuk mendaftarkan endpoint publik dan membungkus endpoint privat menggunakan middleware auth:sanctum:

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\API\AuthController;

// Public Routes
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);

// Protected Routes
Route::middleware('auth:sanctum')->group(function () {
    Route::post('logout', [AuthController::class, 'logout']);
    
    Route::get('user', function (Request $request) {
        return $request->user();
    });
});

3. Implementasi Sisi Klien

Untuk berinteraksi dengan API terproteksi Sanctum, simpan token hasil login ke dalam storage aplikasi klien, lalu sematkan sebagai **Bearer Token** pada Header HTTP setiap kali melakukan request.

Contoh Request dengan JavaScript Fetch API:

const getProfile = async () => {
    const token = localStorage.getItem('auth_token');
    
    const response = await fetch('/api/user', {
        headers: {
            'Authorization': `Bearer ${token}`,
            'Accept': 'application/json',
        },
    });
    return response.json();
};
Best Practices Keamanan API Token

Pastikan Anda mengikuti standarisasi industri berikut saat memproduksi API secara publik:

  • Wajib HTTPS: Selalu paksa endpoint API berjalan di atas SSL/TLS guna mencegah pencurian token lewat metode sniffing jaringan.
  • Abilities Control: Manfaatkan fitur Token Abilities Sanctum untuk membatasi hak akses fungsionalitas token secara spesifik berdasarkan tipe perangkat.
  • Token Expiration: Atur masa kedaluwarsa token pada berkas konfigurasi secara berkala guna meminimalkan penyalahgunaan token yang telah usang.
v