Cara Menggunakan Laravel Sanctum untuk API Authentication: Autentikasi Modern

Autentikasi API adalah bagian krusial dari pengembangan aplikasi web modern. Tanpa sistem autentikasi yang kuat, aplikasi Anda rentan terhadap serangan dan penyalahgunaan data. Laravel, sebagai framework PHP yang populer, menyediakan berbagai cara untuk mengimplementasikan autentikasi. Salah satu opsi yang semakin populer adalah Laravel Sanctum. Artikel ini akan membahas secara mendalam cara menggunakan Laravel Sanctum untuk API authentication: autentikasi modern, mulai dari persiapan hingga implementasi, sehingga Anda dapat mengamankan API Anda dengan lebih efektif.

Apa Itu Laravel Sanctum dan Mengapa Menggunakannya?

Laravel Sanctum adalah paket autentikasi ringan untuk aplikasi Laravel yang menyediakan cara sederhana dan aman untuk mengotentikasi aplikasi single-page (SPA), aplikasi mobile, dan API. Dibandingkan dengan metode autentikasi API tradisional seperti OAuth 2.0, Sanctum lebih mudah diatur dan dipahami, terutama untuk proyek-proyek yang lebih kecil atau menengah.

Keuntungan Menggunakan Laravel Sanctum:

  • Ringan dan Sederhana: Setup yang cepat dan konfigurasi yang minim.
  • Keamanan yang Ditingkatkan: Menggunakan cookie HTTP dan perlindungan CSRF untuk keamanan yang lebih baik.
  • Token API Berbasis Session: Menggunakan session Laravel untuk menyimpan token API, menghindari penyimpanan token jangka panjang di sisi klien.
  • Ideal untuk SPA dan Aplikasi Mobile: Dirancang khusus untuk aplikasi yang mengkonsumsi API dari JavaScript atau aplikasi mobile.
  • Mudah Diintegrasikan: Kompatibel dengan berbagai front-end framework seperti React, Vue, dan Angular.

Persiapan Awal: Instalasi dan Konfigurasi Laravel Sanctum

Sebelum mulai menerapkan Sanctum, pastikan Anda memiliki proyek Laravel yang sudah berjalan. Jika belum, Anda bisa membuat proyek baru dengan perintah:

composer create-project --prefer-dist laravel/laravel nama-proyek
cd nama-proyek

Setelah proyek Laravel siap, ikuti langkah-langkah berikut untuk menginstal dan mengkonfigurasi Laravel Sanctum:

  1. Instalasi Sanctum melalui Composer:

    composer require laravel/sanctum
  2. Publikasikan Konfigurasi dan Migrasi:

    php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"

    Perintah ini akan menyalin file konfigurasi config/sanctum.php ke direktori konfigurasi Anda dan juga migrasi database yang diperlukan.

  3. Jalankan Migrasi Database:

    php artisan migrate

    Migrasi ini akan membuat tabel personal_access_tokens yang digunakan oleh Sanctum untuk menyimpan token API.

  4. Tambahkan HasApiTokens ke Model User:

    Buka model AppModelsUser dan tambahkan trait HasApiTokens:

    <?php
    
    namespace AppModels;
    
    use IlluminateContractsAuthMustVerifyEmail;
    use IlluminateDatabaseEloquentFactoriesHasFactory;
    use IlluminateFoundationAuthUser as Authenticatable;
    use IlluminateNotificationsNotifiable;
    use LaravelSanctumHasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
    
        // ... (kode lainnya)
    }

    Trait HasApiTokens menyediakan metode yang diperlukan untuk mengelola token API untuk pengguna.

  5. Konfigurasi Middleware Sanctum:

    Pastikan middleware EnsureFrontendRequestsAreStateful berada di dalam stack middleware API Anda. Biasanya, ini sudah dikonfigurasi secara otomatis dalam app/Http/Kernel.php. Periksa bagian $middlewareGroups['api']:

    protected $middlewareGroups = [
        'api' => [
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
            AppHttpMiddlewareVerifyCsrfToken::class,
            IlluminateRoutingMiddlewareSubstituteBindings::class,
            LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful::class,
        ],
    ];

    Middleware ini memastikan bahwa permintaan dari aplikasi frontend Anda membawa cookie session yang diperlukan untuk autentikasi.

Implementasi Autentikasi API dengan Sanctum: Membuat dan Menggunakan Token

Setelah persiapan selesai, mari kita implementasikan autentikasi API dengan Sanctum. Kita akan fokus pada pembuatan dan penggunaan token API.

  1. Membuat Token API:

    Anda dapat membuat token API untuk pengguna yang terautentikasi. Contohnya, Anda bisa menambahkan endpoint untuk membuat token API saat pengguna login:

    use IlluminateHttpRequest;
    use IlluminateSupportFacadesAuth;
    
    Route::post('/login', function (Request $request) {
        $credentials = $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);
    
        if (Auth::attempt($credentials)) {
            $user = Auth::user();
            $token = $user->createToken('nama-aplikasi')->plainTextToken;
    
            return response()->json([
                'token' => $token,
                'message' => 'Login berhasil!',
            ]);
        }
    
        return response()->json([
            'message' => 'Login gagal. Email atau password salah.'
        ], 401);
    });

    Dalam contoh ini, setelah pengguna berhasil login, kita menggunakan metode createToken() pada instance $user untuk membuat token baru. 'nama-aplikasi' adalah nama token yang bisa Anda sesuaikan. plainTextToken berisi token sebenarnya yang akan dikirimkan ke klien.

  2. Menggunakan Token API untuk Akses Endpoint Terproteksi:

    Setelah pengguna mendapatkan token, mereka dapat menggunakan token tersebut untuk mengakses endpoint yang memerlukan autentikasi. Untuk ini, Anda perlu melindungi endpoint Anda dengan middleware auth:sanctum.

    use IlluminateHttpRequest;
    use IlluminateSupportFacadesRoute;
    
    Route::middleware('auth:sanctum')->get('/profile', function (Request $request) {
        return $request->user();
    });

    Endpoint /profile sekarang hanya dapat diakses oleh pengguna yang terautentikasi. Middleware auth:sanctum akan memeriksa keberadaan token di header Authorization dengan format Bearer <token>. Jika token valid, pengguna akan diizinkan mengakses endpoint.

    Contoh Penggunaan Token di Header:

    Authorization: Bearer your_generated_api_token

    Pastikan aplikasi frontend atau mobile Anda mengirimkan token API di header Authorization untuk setiap permintaan ke endpoint yang dilindungi.

Perlindungan CSRF dan Statefulness: Memastikan Keamanan Aplikasi SPA

Sanctum memanfaatkan cookie HTTP dan perlindungan CSRF untuk meningkatkan keamanan aplikasi single-page (SPA). Penting untuk memahami bagaimana ini bekerja dan cara mengkonfigurasinya dengan benar.

  • Cookie HTTP: Sanctum menggunakan cookie session Laravel untuk menyimpan informasi autentikasi. Cookie ini memiliki flag HttpOnly, yang berarti cookie tidak dapat diakses oleh JavaScript. Ini membantu mencegah serangan XSS (Cross-Site Scripting).

  • Perlindungan CSRF: Sanctum menggunakan token CSRF (Cross-Site Request Forgery) untuk melindungi aplikasi dari serangan CSRF. Saat pengguna login, Laravel akan menghasilkan token CSRF yang disimpan dalam cookie dan juga disematkan dalam meta tag di halaman HTML. Frontend Anda harus mengirimkan token ini dalam header X-XSRF-TOKEN untuk setiap permintaan POST, PUT, PATCH, atau DELETE.

Konfigurasi CSRF untuk SPA:

  1. Mengambil Token CSRF:

    Anda dapat mengambil token CSRF dari endpoint /sanctum/csrf-cookie yang disediakan oleh Sanctum. Pastikan Anda mengirimkan permintaan ini sebelum mengirimkan permintaan autentikasi. Ini biasanya dilakukan saat aplikasi frontend dimuat.

    import axios from 'axios';
    
    axios.get('/sanctum/csrf-cookie').then(response => {
      // Setelah mendapatkan cookie CSRF, Anda dapat mengirimkan permintaan autentikasi
    });
  2. Mengirimkan Token CSRF di Header:

    Setelah mendapatkan cookie CSRF, pastikan aplikasi frontend Anda mengirimkan token CSRF di header X-XSRF-TOKEN untuk setiap permintaan POST, PUT, PATCH, atau DELETE. Axios secara otomatis menangani ini jika cookie dengan nama XSRF-TOKEN ada.

Penting: Pastikan domain frontend Anda terdaftar di konfigurasi config/cors.php agar permintaan cross-origin diizinkan.

Mengelola Token API: Pencabutan (Revoking) dan Pembatasan

Laravel Sanctum menyediakan cara untuk mengelola token API, termasuk mencabut token tertentu atau semua token untuk pengguna.

  • Mencabut Token Tertentu:

    Pengguna dapat mencabut token API tertentu yang tidak lagi mereka butuhkan. Ini berguna jika token tersebut dicuri atau jika pengguna ingin membatasi akses ke aplikasi.

    use IlluminateHttpRequest;
    use IlluminateSupportFacadesAuth;
    
    Route::post('/logout', function (Request $request) {
        $request->user()->currentAccessToken()->delete();
    
        return response()->json([
            'message' => 'Logout berhasil!'
        ]);
    });

    Dalam contoh ini, endpoint /logout mencabut token API yang sedang digunakan oleh pengguna yang terautentikasi.

  • Mencabut Semua Token:

    Anda juga dapat mencabut semua token API untuk pengguna tertentu. Ini berguna jika pengguna mengubah password atau jika Anda mencurigai adanya aktivitas yang mencurigakan.

    use IlluminateHttpRequest;
    use IlluminateSupportFacadesAuth;
    
    Route::post('/logout-all', function (Request $request) {
        $request->user()->tokens()->delete();
    
        return response()->json([
            'message' => 'Logout semua perangkat berhasil!'
        ]);
    });

    Endpoint /logout-all akan menghapus semua token API yang terkait dengan pengguna yang terautentikasi.

  • Pembatasan Token (Scopes):

    Anda dapat menentukan scopes atau batasan akses untuk setiap token API. Ini memungkinkan Anda untuk memberikan izin yang berbeda ke aplikasi yang berbeda.

    $token = $user->createToken('nama-aplikasi', ['read-profile', 'write-posts'])->plainTextToken;

    Dalam contoh ini, token hanya memiliki izin untuk membaca profil dan menulis posting.

    Untuk memeriksa apakah token memiliki izin tertentu, Anda dapat menggunakan metode tokenCan() di middleware:

    Route::middleware(['auth:sanctum', 'ability:read-profile'])->get('/profile', function (Request $request) {
        return $request->user();
    });

    Middleware ability:read-profile akan memeriksa apakah token memiliki izin read-profile sebelum mengizinkan akses ke endpoint /profile.

Mengatasi Masalah Umum dalam Implementasi Sanctum

Meskipun Sanctum relatif mudah digunakan, Anda mungkin menghadapi beberapa masalah umum selama implementasi. Berikut adalah beberapa solusi untuk masalah yang sering terjadi:

  • Masalah Cookie CORS:

    Pastikan konfigurasi CORS Anda benar. Frontend Anda harus diizinkan untuk mengirimkan dan menerima cookie. Periksa config/cors.php dan pastikan supports_credentials diatur ke true dan domain frontend Anda terdaftar di allowed_origins.

  • Masalah Session Not Starting:

    Pastikan middleware StartSession diaktifkan dalam stack middleware API Anda. Ini diperlukan agar Sanctum dapat menggunakan session Laravel untuk menyimpan token API.

  • Masalah Token Tidak Valid:

    Periksa apakah token yang Anda kirimkan di header Authorization sudah benar dan tidak kedaluwarsa. Pastikan juga Anda menggunakan skema autentikasi Bearer.

  • Masalah CSRF Token Mismatch:

    Pastikan Anda mengambil token CSRF dari endpoint /sanctum/csrf-cookie sebelum mengirimkan permintaan autentikasi. Pastikan juga aplikasi frontend Anda mengirimkan token CSRF di header X-XSRF-TOKEN untuk setiap permintaan POST, PUT, PATCH, atau DELETE.

Alternatif Lain untuk Autentikasi API di Laravel

Selain Laravel Sanctum, ada beberapa opsi lain untuk autentikasi API di Laravel, masing-masing dengan kelebihan dan kekurangan:

  • Laravel Passport: Implementasi OAuth 2.0 yang lengkap. Lebih kompleks daripada Sanctum, tetapi cocok untuk aplikasi yang memerlukan kontrol akses yang lebih granular dan integrasi pihak ketiga.

  • JWT (JSON Web Tokens): Menggunakan token JWT untuk autentikasi. JWT adalah standar industri yang populer, tetapi memerlukan penanganan token yang lebih hati-hati dan mungkin lebih rentan terhadap serangan jika tidak dikonfigurasi dengan benar.

  • Basic Authentication: Metode autentikasi yang sederhana, tetapi kurang aman dibandingkan dengan metode lain. Tidak direkomendasikan untuk aplikasi yang sensitif terhadap keamanan.

Pilihan metode autentikasi terbaik tergantung pada kebutuhan spesifik proyek Anda. Sanctum adalah pilihan yang baik untuk proyek-proyek yang lebih kecil atau menengah yang membutuhkan autentikasi API yang sederhana dan aman. Passport lebih cocok untuk aplikasi yang lebih besar dan kompleks yang memerlukan kontrol akses yang lebih granular.

Kesimpulan: Mengamankan API Anda dengan Autentikasi Modern Menggunakan Laravel Sanctum

Cara menggunakan Laravel Sanctum untuk API authentication: autentikasi modern adalah pilihan yang tepat untuk mengamankan API Anda dengan cara yang sederhana, aman, dan efisien. Dengan mengikuti panduan dalam artikel ini, Anda dapat dengan mudah menginstal, mengkonfigurasi, dan menerapkan Sanctum untuk melindungi endpoint API Anda dari akses yang tidak sah. Ingatlah untuk selalu memprioritaskan keamanan dan mengikuti praktik terbaik dalam pengembangan aplikasi web. Dengan Sanctum, Anda dapat fokus pada pengembangan fitur aplikasi Anda tanpa khawatir tentang kompleksitas autentikasi API.