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
... 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=
Untuk mengatur Sanctum agar bisa menggunakan Token tanpa Statefull maka biarkan pengaturan App\Http\Kernel
.
<?php 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
Ubah file di database/seeders/DatabaseSeeder.php
<?php ... class DatabaseSeeder extends Seeder { public function run() { // Uncomment bagian ini // \App\Models\User::factory(10)->create(); } } ...
Ubah menjadi
<?php ... class DatabaseSeeder extends Seeder { 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
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.