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.