Laravel Sanctum
Setelah kalian belajar laravel biasa sekarang kalian belajar Laravel Sanctum itu seperti alat bantu di Laravel yang digunakan untuk membuat sistem login (autentikasi) yang simpel. Ini cocok dipakai untuk aplikasi web satu halaman (SPA), aplikasi di HP (mobile), atau aplikasi yang saling kirim data lewat API. Dengan Sanctum, setiap pengguna bisa punya beberapa ‘token’—semacam kunci akses digital—yang bisa dipakai untuk masuk ke sistem. Setiap token bisa diatur hanya bisa melakukan hal-hal tertentu sesuai izin yang diberikan
Installation Sanctum
Silahkan jalankan perintah di bawah ini di terminal/CMD :
|
1 |
php artisan install:api |
Jika muncul pertanyaan seperti berikut ini, maka silahkan ketik yes dan Enter.

Update Model User
Sekarang, kita melanjutkanuntuk melakukan beberapa konfigurasi di dalam model User agar bisa menggunakan Sanctum untuk generate token.
Silahkan buka file app/Models/User.php kemudian ubah kode-nya menjadi seperti berikut ini :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens,HasFactory, Notifiable; /** * The attributes that are mass assignable. * * @var array<int, string> */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var array<int, string> */ protected $hidden = [ 'password', 'remember_token', ]; /** * Get the attributes that should be cast. * * @return array<string, string> */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; } } |
Membuat RESTful API Authentication dan Register User
Sekarang, kita akan belajar cara membuat RESTful untuk proses dan daftar akun (register) menggunakan Laravel Sanctum. Jadi nanti kita akan buat dua fitur utama: register (daftar) dan login (masuk). Untuk mengetes atau mencoba API yang kita buat, kita akan pakai alat bantu bernama Postman, jadi silahkan teman-teman bisa install tools tersebut melalui link berikut ini : https://www.postman.com/downloads/
Membuat Controller API Authentication
Disini kita akan mengelompokan semua controller yang digunakan untuk RESTful API di dalam folder app/Http/Controllers/Api. Silahkan jalankan perintah berikut ini di dalam terminal/CMD :
|
1 |
php artisan make:controller Api/AuthController |
Jika perintah di atas berhasil, maka kita akan mendapatkan 1 file controller baru di dalam folder app/Http/Controllers/Api/AuthController.php. Silahkan buka file tersebut dan ubah kode-nya menjadi seperti berikut ini :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
<?php namespace App\Http\Controllers\Api; use Exception; use App\Models\User; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; class AuthController extends Controller { public function register(Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed', ]); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password) ]); $token = $user->createToken('authToken')->plainTextToken; if($user) { return response()->json([ 'token_type' => 'Bearer', 'access_token' => $token, 'user' => $user, 'message' => "berhasil register" ], 201); } return response()->json([ 'success' => false, ], 409); } public function login(Request $request) { try { // validasi input $validator = Validator::make($request->all(), [ 'email' => 'required|email', 'password' => 'required', ]); if ($validator->fails()) { return response()->json($validator->errors(), 400); } // cek Credentials Login $user = User::where('email', $request->email)->first(); if (! $user) { return response()->json(['message' => 'Email User Salah'], 400); } // jika hash tidak sesuai muncul alert if (!Hash::check($request->password, $user->password, [])) { return response()->json([ 'success' => false, 'message' => 'Password salah', ], 401); } // jika berhasil $token = $user->createToken('authToken')->plainTextToken; return response()->json([ 'token_type' => 'Bearer', 'access_token' => $token, 'user' => $user, 'message' => "berhasil login" ]); } catch (Exception $error) { return response()->json([ 'status' => false, 'message' => $error->getMessage(), ], 500); } } public function logout(Request $request) { $user = $request->user(); $user->tokens()->delete(); return response()->json([ 'user' => $user, 'message' => "berhasil logout" ]); } } |
Api.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php use App\Http\Controllers\Api\AuthController; use App\Http\Controllers\Api\CarController; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum'); Route::post('login', [AuthController::class, 'login']); Route::post('register', [AuthController::class, 'register']); |
Uji Coba Register User
Sekarang, kita akan melakukan uji coba RESTful API untuk proses register, silahkan buka postman dan pada bagian URL, silahkan masukkan : http://127.0.0.1:8000/api/register dan jangan lupa untuk methodnya menggunakan POST, kemudian klik Send, maka kita akan mendapatkan response kurang lebih seperti berikut ini :
Response tersebut merupakan hasil validasi, karena kita belum memasukkan data apapun di dalam Body, sekarang kita akan coba lagi dengan menggunakan data.
Silahkan klik pada tab Body dan pilih form-data, kemudian isikan beberapa key dan value seperti berikut ini :
| KEY | VALUE |
|---|---|
| name | Muhamad Taufiq |
| [email protected] | |
| password | password |
| password_confirmation | password |
Di atas tadi, kita sudah membuat contoh data user. Sekarang silakan klik tombol Send di Postman. Kalau berhasil, kamu akan mendapatkan balasan (response) dari server yang kurang lebih isinya seperti ini:

|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "token_type": "Bearer", "access_token": "9|9pxZGAoOWRzUjikYqziTpuva7gE8HyVtNNV2KLEr446fc61c", "user": { "name": "M Taufiq H", "updated_at": "2025-05-25T12:27:31.000000Z", "created_at": "2025-05-25T12:27:31.000000Z", "id": 3 }, "message": "berhasil register" } |
Setelah tadi berhasil mencoba proses register, sekarang kita akan lanjut mencoba proses login. Caranya, buka tab baru di Postman, lalu masukkan URL ini: http://127.0.0.1:8000/api/login. Pastikan kamu memilih metode POST, lalu klik tombol Send. Jika berhasil, kamu akan melihat hasil balasan (response) dari server seperti ini:
|
1 2 3 4 5 6 7 8 |
{ "email": [ "The email field is required." ], "password": [ "The password field is required." ] } |
Di atas kita mendapatkan response message dari validasi, karena kita belum memasukkan data apapun di dalam tab Body. Sekarang silahkan klik tab Body dan pilih form-data, kemudian masukkan beberapa key dan value berikut ini :
| KEY | VALUE |
|---|---|
| [email protected] | |
| password | password |
Silahkan isi dengan data tersebut, karena kita tadi menggunakan data tersebut untuk proses registrasi. Kemudian klik Send. Jika berhasil maka kita akan mendpatkan response kurang lebih seperti berikut ini :

|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "token_type": "Bearer", "access_token": "10|nV5TMWy5En70cb1exaviaA9QFnTVVAWLPjqgOzrZ3043c754", "user": { "id": 3, "name": "M Taufiq H", "email_verified_at": null, "created_at": "2025-05-25T12:27:31.000000Z", "updated_at": "2025-05-25T12:27:31.000000Z" }, "message": "berhasil login" } |
Tadi kita sudah berhasil melakukan proses login dan mendapatkan token dari Sanctum. Token ini bisa kita gunakan sebagai ‘tanda pengenal’ agar server mengizinkan kita untuk mengambil data dari database.
“Token ini penting karena tanpa token, server akan menolak permintaan kita. Jadi, token berfungsi seperti ID card yang menunjukkan bahwa kita sudah login dan punya izin akses data.”
Membuat API Controller Car
Sekarang, silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Laravel-nya.
|
1 |
php artisan make:controller Api/CarController -r |
Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan file baru yang berada di dalam folder app/Http/Controllers/Api/CarController.php. Silahkan buka file tersebut, kemudian ubah semua kode-nya menjadi seperti berikut ini
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Http\Resources\CarResource; use App\Models\Car; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Validator; class CarController extends Controller { /** * Display a listing of the resource. */ public function index() { // $cars = Car::latest()->paginate(5); //return collection of cars as a resource return new CarResource(true, 'List Data cars', $cars); } /** * Show the form for creating a new resource. */ public function create() { // } /** * Store a newly created resource in storage. */ public function store(Request $request) { // $validator = Validator::make($request->all(), [ 'merk_id' => 'required|exists:merks,id', 'model' => 'required', 'color' => 'required', 'year' => 'required|numeric', 'price' => 'required|numeric', 'image' => 'required|image|mimes:jpg,jpeg,png,gif,svg|max:2048', ]); if ($validator->fails()) { return response()->json($validator->errors(), 422); } //upload image $image = $request->file('image'); $image->storeAs('public/storage/car_images', $image->hashName()); $car = Car::create([ 'merk_id' => $request->merk_id, 'model' => $request->model, 'color' => $request->color, 'year' => $request->year, 'price' => $request->price, 'image' => $image->hashName(), ]); //return response return new CarResource(true, 'Data Car Berhasil Ditambahkan!', $car); } /** * Display the specified resource. */ public function show(string $id) { // $car = Car::find($id); return new CarResource(true, 'Detail Data Mobil!', $car); } /** * Show the form for editing the specified resource. */ public function edit(string $id) { // } /** * Update the specified resource in storage. */ public function update(Request $request, string $id) { $car = Car::find($id); $validator = Validator::make($request->all(), [ 'merk_id' => 'required|exists:merks,id', 'model' => 'required', 'color' => 'required', 'year' => 'required|integer', 'price' => 'required|integer', 'image' => 'nullable|image|mimes:jpg,jpeg,png' ]); //check if validation fails if ($validator->fails()) { return response()->json($validator->errors(), 422); } //check if image is not empty if ($request->hasFile('image')) { //upload image $image = $request->file('image'); $image->storeAs('public/storage/car_images', $image->hashName()); //delete old image Storage::delete('public/storage/car_images/' . basename($car->image)); //update car with new image $car->update([ 'merk_id' => $request->merk_id, 'model' => $request->model, 'color' => $request->color, 'year' => $request->year, 'price' => $request->price, 'image' => $image->hashName(), ]); } else { //update car without image $car->update([ 'merk_id' => $request->merk_id, 'model' => $request->model, 'color' => $request->color, 'year' => $request->year, 'price' => $request->price, ]); } //return response return new CarResource(true, 'Data Mobil Berhasil Diubah!', $car); } /** * Remove the specified resource from storage. */ public function destroy(string $id) { // //find car by ID $car= Car::find($id); //delete image Storage::delete('public/storage/car_images/'.basename($car->image)); //delete car $car->delete(); //return response return new CarResource(true, 'Data car Berhasil Dihapus!', null); } } |
Setelah itu, silahkan teman-teman buka file routes/api.php, kemudian ubah kode-nya menjadi seperti berikut ini
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php use App\Http\Controllers\Api\AuthController; use App\Http\Controllers\Api\CarController; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum'); Route::post('login', [AuthController::class, 'login']); Route::post('register', [AuthController::class, 'register']); Route::apiResource('/car', CarController::class)->middleware('auth:sanctum'); |
Di atas, kita menambahkan route baru dengan jenis apiResource dan memiliki path /car. Untuk memastikan route tersebut berhasil ditambahkan, teman-teman bisa menjalankan perintah berikut ini di dalam terminal/CMD ini
tampil semua

Ini Tampil 1

Ini Tambah

Ini ubah

Ini hapus















