Membuat REST API dengan Laravel Sanctum

Membangun REST API adalah keterampilan wajib ketika aplikasi Anda perlu dikonsumsi oleh aplikasi mobile, single-page application (SPA) React/Vue, atau layanan lain. Laravel Sanctum...

Membuat REST API dengan Laravel Sanctum

Membangun REST API adalah keterampilan wajib ketika aplikasi Anda perlu dikonsumsi oleh aplikasi mobile, single-page application (SPA) React/Vue, atau layanan lain. Laravel Sanctum menyediakan sistem autentikasi berbasis token yang ringan namun aman, tanpa kerumitan OAuth. Tutorial ini membangun API lengkap dengan endpoint register, login, proteksi route, dan JSON yang rapi menggunakan API Resource.

1. Instalasi Laravel Sanctum

Pada Laravel 11 API scaffolding bisa dipasang lewat satu perintah artisan yang sekaligus menyiapkan Sanctum, file routes/api.php, dan migration token:

php artisan install:api

Perintah ini menambahkan paket laravel/sanctum, menerbitkan migration tabel personal_access_tokens, lalu Anda tinggal menjalankan migrasi:

php artisan migrate

Untuk versi lama (Laravel 10), instal manual:

composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

2. Menyiapkan Model User

Agar User bisa menerbitkan token, tambahkan trait HasApiTokens pada model App\Models\User:

use Laravel\Sanctum\HasApiTokens;

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

Trait ini memberi method createToken() yang menghasilkan token acak untuk disimpan klien dan dikirim di setiap request.

3. Endpoint Register dan Login

Buat controller khusus autentikasi:

php artisan make:controller Api/AuthController

Isi method register() untuk membuat user baru sekaligus menerbitkan token:

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

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

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

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

Method login() memeriksa kredensial lalu mengembalikan token baru. Selalu gunakan pesan error yang sama untuk email maupun password salah agar tidak membocorkan info:

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

    $user = User::where('email', $data['email'])->first();

    if (! $user || ! Hash::check($data['password'], $user->password)) {
        return response()->json([
            'message' => 'Kredensial tidak valid.',
        ], 401);
    }

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

    return response()->json(['token' => $token]);
}

4. Mendaftarkan Route API

Semua route API diletakkan di routes/api.php dan otomatis mendapat prefix /api. Route publik untuk register/login, dan route terproteksi untuk sisanya:

use App\Http\Controllers\Api\AuthController;

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

Route::middleware('auth:sanctum')->group(function () {
    Route::get('/user', fn (Request $request) => $request->user());
    Route::post('/logout', [AuthController::class, 'logout']);
    Route::apiResource('products', ProductController::class);
});

5. Memproteksi Route dengan auth:sanctum

Middleware auth:sanctum memeriksa header Authorization: Bearer <token>. Jika token tidak valid, Laravel otomatis menolak dengan status 401. Di dalam route terproteksi, $request->user() mengembalikan user pemilik token.

Untuk logout, hapus token yang sedang dipakai agar tidak bisa digunakan lagi:

public function logout(Request $request)
{
    $request->user()->currentAccessToken()->delete();
    return response()->json(['message' => 'Berhasil logout.']);
}

6. Merapikan JSON dengan API Resource

Mengembalikan model mentah membocorkan kolom yang tidak perlu. API Resource memberi Anda kontrol penuh atas bentuk JSON:

php artisan make:resource ProductResource
public function toArray(Request $request): array
{
    return [
        'id'    => $this->id,
        'name'  => $this->name,
        'price' => (int) $this->price,
        'created_at' => $this->created_at->toDateString(),
    ];
}

Gunakan di controller. Untuk koleksi pakai ::collection():

public function index()
{
    return ProductResource::collection(Product::latest()->paginate(10));
}

public function show(Product $product)
{
    return new ProductResource($product);
}

7. Menguji dengan cURL dan Postman

Uji register lewat terminal:

curl -X POST http://localhost:8000/api/register \
  -H "Accept: application/json" \
  -d "name=Budi&email=budi@mail.com&password=rahasia88&password_confirmation=rahasia88"

Ambil token dari respons, lalu akses route terproteksi:

curl http://localhost:8000/api/user \
  -H "Accept: application/json" \
  -H "Authorization: Bearer 1|xxxxxxxxxxxxxxxxx"

Di Postman, buka tab Authorization, pilih tipe Bearer Token, dan tempel token. Selalu kirim header Accept: application/json agar error validasi dikembalikan sebagai JSON, bukan halaman HTML.

Praktik Terbaik

  • Selalu gunakan HTTPS di produksi agar token tidak tersadap.
  • Beri nama token bermakna (misal per perangkat) supaya mudah dicabut satu per satu.
  • Batasi kemampuan token dengan abilities: createToken('name', ['product:read']) lalu cek dengan tokenCan().
  • Terapkan rate limiting pada endpoint login untuk mencegah brute force.

Dengan pola ini Anda punya REST API yang aman dan terstruktur: register dan login menerbitkan token, auth:sanctum menjaga route, dan API Resource memastikan JSON yang konsisten untuk dikonsumsi aplikasi mobile maupun frontend modern.

Lapisan Keamanan Tambahan API

Selain autentikasi token, API yang tangguh memerlukan lapisan keamanan berlapis. Terapkan pembatasan laju permintaan untuk mencegah penyalahgunaan dan serangan brute force. Validasi setiap input dengan ketat agar terhindar dari data yang tidak sah, dan selalu gunakan HTTPS agar token maupun data tidak dapat disadap di jaringan. Batasi cakupan token sesuai kebutuhan sehingga sebuah token hanya memiliki izin seminimal mungkin. Catat aktivitas penting untuk audit, dan segera cabut token yang mencurigakan. Untuk data sensitif, pertimbangkan masa berlaku token yang pendek disertai mekanisme penyegaran. Dengan menggabungkan autentikasi Sanctum dan praktik keamanan ini, API Anda tidak hanya berfungsi, tetapi juga terlindungi dari ancaman umum yang kerap menargetkan layanan publik.

Yudhi
Ditulis oleh
Yudhi
Founder & Lead Developer, GudangCode

Yudhi adalah founder GudangCode dan developer Laravel dengan pengalaman membangun puluhan sistem informasi bisnis siap pakai — mulai dari POS, HRIS, hingga aplikasi manajemen. Ia menulis panduan dan artikel di GudangCode untuk membantu developer Indonesia menjalankan, memahami, dan men-deploy source code Laravel dengan benar.

Laravel PHP MySQL Sistem Informasi Bisnis
Lihat semua artikel Yudhi
Mau source code & aplikasi lengkapnya?

Daftar gratis untuk mengunduh aplikasi bisnis, sistem informasi, dan source code Laravel siap pakai.

Daftar Gratis & Download
Laravel Sanctum Api Programming & Laravel
📚 Free Learning Hub

Learn Coding for Free at DhieCoderWeb

Explore Laravel, PHP, JavaScript tutorials, source code, web development guides, and practical programming tips.

DhieCoderWeb
100+
Tutorials
Free
Learning
SEO
Tips
Visit Dhiecoderweb.com →

Dapatkan Akses Penuh Sekarang!

Bergabunglah menjadi member kami dan dapatkan akses eksklusif ke seluruh fitur unggulan aplikasi ini. Proses cepat, mudah, dan langsung bisa Anda gunakan.

Daftar Members Sekarang
Tim Support
Online
Isi data dulu untuk mulai chat:
Beri rating & testimoni sebelum menutup:
Live chat by gudangcode.com