KodeJs
Tutorial API Authentication Laravel 13 Pakai Laravel Sanctum
Laravel3 menit baca

Tutorial API Authentication Laravel 13 Pakai Laravel Sanctum

Kembali ke Blog
Egi Samsul Mu'arifEgi Samsul Mu'arif6 September 20263 menit baca

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:

  1. Mempublikasikan file konfigurasi config/sanctum.php.

  2. Menjalankan migrasi untuk tabel personal_access_tokens.

  3. Memastikan trait HasApiTokens terpasang pada model User.

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.


Egi Samsul Mu'arif

Ditulis oleh

Egi Samsul Mu'arif

Web & Mobile Developer

Artikel Terkait

Lihat semua