Tutorial Secure API Authentication API Laravel dengan Sanctum - Panduan Lengkap

logo icon

Admin Teguh

-

04 September 2025

Tutorial Secure API Authentication API Laravel dengan Sanctum - Panduan Lengkap

Pernakah kalian bertanya-tanya apakah API yang telah kita buat sudah memiliki level pengamanan yang cukup agar terhindar dari serangan cyber? Faktanya, banyak developer pemula yang melupakan aspek penting setelah berhasil membuat API, yaitu bagaimana cara melindungi API yang menyimpan data sensitif dari kebocoran. Cara menangani permasalahan tersebut adalah menerapkan autentikasi berbasis token untuk API pada aplikasi yang kita buat, salah satunya menggunakan Laravel Sanctum.

Laravel Sanctum menyediakan sistem autentikasi ringan untuk SPA (Single Page Application), aplikasi mobile, dan API sederhana. Dalam artikel ini akan membahas pengertian dan fitur Laravel Sanctum, serta panduan implementasi autentikasi API yang aman di Laravel.

Apa itu Laravel Sanctum

Laravel Sanctum adalah package atau library resmi yang menawarkan autentikasi berbasis token untuk aplikasi Laravel. Sanctum dirancang untuk Single Page Application, Mobile App, dan API Sederhana tanpa menggunakan sistem yang lebih kompleks seperti Laravel Passport (OAuth2). Sanctum bekerja dengan 2 pendekatan yaitu:

  • Token API - untuk aplikasi yang membutuhkan autentikasi berbasis token klasik.
  • Cookie-based SPA Authentication - untuk SPA yang berjalan di domain yang sama, menggunakan session cookie yang aman. Namun pada pembahasan ini, kita akan menggunakan Token API Authentication.

Fitur Utama Laravel Sanctum

Laravel Sanctum memiliki beberapa fitur unggulan yaitu:

  • Autentikasi Token API
  • Autentikasi SPA
  • Support Mobile App Authentication
  • Token Abilities / Scope Token
  • Token Expiration
  • Mudah Digunakan dan Ringan

Persiapan

Sebelum kita mengimplementasikan Laravel Sanctum pada aplikasi laravel, pastikan kalian memiliki:

  • Laravel 12.x yang sudah terinstall.
  • PHP 8.2 atau lebih tinggi.
  • Composer
  • Pemahaman dasar tentang Laravel.
  • Database (MySQL, PostgreeSQL, dll.)

Install Laravel Sanctum

Buka terminal paste kan script dibawah ini.

composer require laravel/sanctum

Publish konfigurasi sanctum.

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

Jalankan migrasi

php artisan migrate

Konfigurasi Laravel Sanctum

  • Config Middleware

Buka file bootstrap/app.php tambahkan kode dibawah ini.

$middleware->statefulApi(); 

dan

api: __DIR__.'/../routes/api.php',

sehingga full kode untuk file app.php menjadi seperti ini.

return Application::configure(basePath: dirname(__DIR__))
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->statefulApi(); 
    })
    ->withExceptions(function (Exceptions $exceptions) {
       
    })->create();
  • CORS

Pastekan perintah dibawah ini pada terminal untuk melakukan publish config cors.php.

php artisan config:publish cors

Update file config/cors.php untuk mengizinkan credentials.

'supports_credentials' => true,
  • Set Expired Token

Buka file config/sanctum.php untuk mengatur expired token dalam satuan menit.

'expiration' => 60 //1 hour

Implementasi

  • Konfigurasi User Model

Buka file app/Models/User.php lalu tambahkan trait HasApiTokens seperti dibawah ini.

<?php

namespace App\Models;

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
   use HasFactory, Notifiable, HasApiTokens;
}
  • Konfigurasi Controller

Buat controller dengan nama AuthController untuk menagani proses autentikasi.

php artisan make:controller Api/AuthController

buka file AuthController dan pastekan kode dibawah ini.

<?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
{
    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|confirmed',
        ]);

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

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

        return response()->json([
            'user' => $user,
            'message' => 'registration success'
        ], 201);
    }

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

        $user = User::where('email', $request->email)->first();

        if (!$user || !Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['invalid credentials.'],
            ]);
        }

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

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

    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();

        return response()->json([
            'message' => 'logout success'
        ]);
    }

    public function user(Request $request)
    {
        return response()->json([
            'user' => $request->user(),
            'message' => 'user data retrieved successfully'
        ]);
    }
}

Mari kita bahas beberapa bagian kode diatas.

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

Fungsi createToken() adalah method dari trait HasApiTokens untuk generate token berupa plainTextToken.

$request->user()->currentAccessToken()->delete();

Menghapus token yang telah digenerate dan digunakan oleh user.

  • Update Route API

Buat file bernamakan api.php didalam folder routes/ lalu tempelkan kode dibawah ini.

<?php

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

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::get('/get-user', [AuthController::class, 'user']);
});

Kita mendefinisikan middleware('auth:sanctum') didalam route group, yang berarti seluruh route didalam group tersebut akan diproteksi oleh auth:sanctum.

Pengujian API Menggunakan Postman

Kita menggunakan tools Postman untuk menguji API yang telah kita buat.

  1. Register User
  • POST /api/register
  • Body {"name": "NganggurDev", "email": "bussines.nganggurdev@gmail.com", "password": "admin123", "password_confirmation": "admin123"} Postman Register Laravel Sanctum - NganggurDev
  1. Login
  • POST /api/login
  • Body {"email": "bussines.nganggurdev@gmail.com", "password": "admin123"} Postman Login Laravel Sanctum - NganggurDev
  1. Access Protected Route
  • GET /api/get-user
  • Header: Authorization: Bearer <access token>

User Memiliki Bearer Token (Authenticated) Postman Get User Laravel Sanctum - NganggurDev Unauthenticated Postman Get User Unauth Laravel Sanctum - NganggurDev 4. Logout

  • POST /api/logout
  • Header: Authorization: Bearer <access token> Postman Logout Laravel Sanctum - NganggurDev

Masalah Umum Yang Sering Terjadi

  • Problem CORS

Solusi: pastikan konfigurasi CORS sudah benar.

  • 401 Unauthorized

Solusi: perika apakah header Authorization diformat dengan benar: Bearer {token}.

  • Session dengan SPA

Solusi: pastikan untuk call api /sanctum/csrf-cookie sebelum membuat request yang terotentikasi di SPA.

  • Token Tidak Expired Sesuai Kebutuhan

**Solusi: ** konfigurasi waktu expiration di config/sanctum.php dan implementasikan custom expiration untuk token tertentu jika diperlukan.

  • Token Terduplikasi untuk User yang Sama

Solusi: implementasikan strategi revoke token lama saat login baru atau batasi jumlah maksimum token aktif per user.

Kesimpulan

Laravel Sanctum menyediakan solusi untuk mengatasi masalah pengamanan data sensitif untuk aplikasi web modern. Dengan mengikuti panduan ini, kita telah mempelajari dasar-dasar implementasi autentikasi API yang aman di Laravel 12.

Terimakasih.

Teguh Budi Laksono

Teguh Budi Laksono

"bukan orang sempurna, hanya seseorang yang terus belajar dan berusaha, karena ia percaya bahwa mimpi besar lahir dari proses panjang dan konsisten."

Tags :

laravel security

how to protect your api route with laravel sanctum

secure api auth with laravel sanctum

laravel

laravel sanctum

rest api

learn coding with nganggurdev

Suka dengan artikel di NganggurDev? Yuk, beri dukungan untuk penulis. Terima kasih banyak!

Want to read more? Click me!