Setup Laravel Sanctum Api Dengan Token

Setup Laravel Sanctum Api Dengan Token

Laravel Sanctum Adalah Package First party dari laravel yang diperuntukan untuk Authentikasi ke Front End. Namun jika melihat dari Dokumentasi Laravelnya Sanctum itu diperuntukan untuk SPA dengan Proteksi csrf. Jika menggunakan Methode ini maka domain untuk production harus menggunakan session dan diharuskan menggunakan top level domain yang sama. Misal domain untuk frontend adalah example.com maka Api Backend nya harus menggunkan Sub domain api.example.com dan ini dinamakan Stateful

Nah disini akan kita buat Authentikasi dengan Sanctum menggunakan Token dengan berbeda domain dan bisa menjadi ini akan lebih flexible untuk kamu.

Oke Mari kita Mulai, buat project Laravel dengan menggunakan cli, disini saya asumsikan anda sudah menggunakan atau menginstall Laravel Valet

laravel new sanctum

Maka dengan command diatas akan membuat sebuah project bernama sanctum

...
   _                               _
  | |                             | |
  | |     __ _ _ __ __ ___   _____| |
  | |    / _` | '__/ _` \ \ / / _ \ |
  | |___| (_| | | | (_| |\ V /  __/ |
  |______\__,_|_|  \__,_| \_/ \___|_|

Creating a "laravel/laravel" project at "./sanctum"
Info from https://repo.packagist.org: #StandWithUkraine
Installing laravel/laravel (v9.3.7)
  - Downloading laravel/laravel (v9.3.7)
  - Installing laravel/laravel (v9.3.7): Extracting archive
Created project in /Users/imansugirman/Sites/Project/sanctum
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 105 installs, 0 updates, 0 removals
  - Locking brick/math (0.10.2)
  - Locking dflydev/dot-access-data (v3.0.1)
  - Locking doctrine/inflector (2.0.5)
  - Locking doctrine/instantiator (1.4.1)
  - Locking doctrine/lexer (1.2.3)
  - Locking dragonmantank/cron-expression (v3.3.2)
  - Locking egulias/email-validator (3.2.1)
  - Locking fakerphp/faker (v1.20.0)
  - Locking filp/whoops (2.14.5)
  - Locking fruitcake/php-cors (v1.2.0)
  - Locking graham-campbell/result-type (v1.1.0)
  - Locking guzzlehttp/guzzle (7.5.0)
  - Locking guzzlehttp/promises (1.5.2)
  - Locking guzzlehttp/psr7 (2.4.1)
...
  - Installing laravel/sanctum (v3.0.1): Extracting archive
  ...

Dan laravel sanctum akan terinstall otomatis ketika membuat project Laravel dengan valet. Nah Sekarang kita setup untuk .env file dilaravel untuk disesuaikan dengan database kita :

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sanctum
DB_USERNAME=root
DB_PASSWORD=

Jangan Aktifkan Statefull

Untuk mengatur Sanctum agar bisa menggunakan Token tanpa Statefull maka biarkan pengaturan App\Http\Kernel.

    protected $middlewareGroups = [
        ...

        'api' => [
            // Bagian ini jangan di uncomment
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

Sekarang kita atur untuk config/cors.php untuk mengamankan jika ada request masuk dari domain yang tidak kita inginkan :

<?php

return [

    'paths' => ['api/*', 'sanctum/csrf-cookie'],
    'allowed_methods' => ['*'],
    // Disini masukan domain yang bisa akses ke api anda
    'allowed_origins' => ['http://localhost:3000', 'https://example.com'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => false,

];

Setelah melakukan pengaturan diatas sekarang kita migrate database anda dengan cara memasukan perintah :

php artisan migrate:fresh

Sebelumnya jika anda ingin menggunakan demo faker untuk membuat user demo bisa anda edit dulu file DatabaseSeeder.php

Jika anda ingin membuat User Demo Lakukan ini

Ubah file di database/seeders/DatabaseSeeder.php

...
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // Uncomment bagian ini
        // \App\Models\User::factory(10)->create();

    }
}
...

Ubah menjadi

...
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // Laravel akan membuat 10 user demo
        \App\Models\User::factory(10)->create();

    }
}
...

Dan sekarang kita akan refresh migration kita

php artisan migrate:fresh --seed

Membuat LoginController Untuk Logic Authentication

Dan sekarang kita buat controller untuk Login :

php artisan make:controller LoginController

Nah setelah terbuat file LoginController.php maka kita edit

use App\Models\User;
use Illuminate\Support\Facades\Auth;

....
    public function store(Request $request): JsonResponse
    {
        // Silahkan buat Validasi Sendiri disini

        if (! Auth::attempt($request->only('email', 'password'))) {
            return responser()->json(['success' => false, 'message' => 'unauthenticated', 'token' => null]);
        }

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

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

        return response()->json(['success' => true, 'message' => 'Login Berhasil', 'token' => $token]);

    }

Demikian tutorial Login Laravel menggunakan Sanctum dengan Metode Token Authentication. Semoga Bermanfaat.