Assalamualaikum Warohmatulloh Wabarokatuh, dalam tulisan ini kita akan belajar bagaimana membuat autentikasi API dengan Laravel Sanctum. Sanctum, entah sejak Laravel versi 8 titik berapa menjadi package default yang pada dependency ketika menginstal Laravel.
Sanctum sejatinyua menyediakan dua metode autentikasi. Pertama adalah untuk web frontend yang menggunakan cookies dan yang kedua adalah dengan token untuk aplikasi mobile (Android / iOs).
Skenarionya kita akan buat autentikasi untuk API yang akan kita sajikan untuk pengembang Aplikasi Android ataupun iOs.
Sebelum memulai untuk bikin aplikasinya, instal dulu Laravel dan setup database serta jalankan migration bawaaan Laravel.
Buat Endpoint API Register
Pertama kita perlu buat sebuah endpoint untuk mendaftarkan user dan memberikan akses token. Seperti biasanya kita mulai dari membuat controller terlebih dahulu, kali ini kita akan gunakan Single Action Controller. Gunakan perintah di bawah ini.
php artisan make:controller Api\\Auth\\RegisterController -i
Kemudian buat sebuah Class Resource untuk mengatur bentuk response, gunakan perintah.
php artisan make:resource UserResource
Berikutnya sesuaikan bentuk response yang ingin kita tampilkan pada file app/Http/Resources/UserResource.php
.
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
];
}
}
Kemudian cari controller yang sudah terbuat pada app/Http/Controllers/Api/Auth/RegisterController.php
dan ubah kodenya menjadi seperti ini.
<?php
namespace App\Http\Controllers\Api\Auth;
use App\Actions\Fortify\PasswordValidationRules;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class RegisterController extends Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke(Request $request)
{
$this->validate($request, [
'name' => ['required', 'string', 'max:255'],
'email' => [ 'required', 'string', 'email', 'max:255', Rule::unique(User::class),],
'password' => ['required','min:8'],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
]);
$token = $user->createToken('myAppToken');
return (new UserResource($user))->additional([
'token' => $token->plainTextToken,
]);
}
}
Selanjutnya daftarkan pada route/api.php
Route::post('auth/register', \App\Http\Controllers\Api\Auth\RegisterController::class);
Kemudian lakukan pengujian dengan menggunakan Postman Rest Client.
Buat Endpoint API Login
<?php
namespace App\Http\Controllers\Api\Auth;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use Illuminate\Http\Request;
class LoginController extends Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke(Request $request)
{
$credentials = $request->validate([
'email' => ['required'],
'password' => ['required'],
]);
if (auth()->attempt($credentials)) {
$user = auth()->user();
return (new UserResource($user))->additional([
'token' => $user->createToken('myAppToken')->plainTextToken,
]);
}
return response()->json([
'message' => 'Your credential does not match.',
], 401);
}
}
Daftarkan route login ke dalam routes/api.php
.
Route::post('auth/login', \App\Http\Controllers\Api\Auth\LoginController::class);
Menggunakan Token untuk mengakses endpoint yang dilindungi Middleware
Pada percobaan di atas kita sudah berhasil mendapatkan token, nah token tersebut yang akan berguna sebagai credential untuk mengakses endpoint yang dilindungi middleware auth. Kebetulan pada file routes/api.php
sudah ada sebuah endpoint yang bisa digunakan untuk uji coba.
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Untuk uji coba gunakan Postman lagi.
Seperti yang terlihat pada gambar di atas, request yang kita kirimkan gagal karena tidak terautentikasi. Lalu bagaimana cara melakukan autentikasi dengan token pada sebuah API? caranya dengan menambahkan header Authorization
, kemudian isi nilainya dengan Bearer(spasi)[Token]
.
Jika header Authorization
sudah terisi dan request dikirim, maka kita akan mendapatkan response seperti ini.
Atau bisa gunakan tab Authorization
pilih Bearer Token
lalu isi dengan token yang dimiliki.
Seperti itulah kurang lebihnya untuk membuat Autentikasi API dengan Laravel Sanctum, semoga bermanfaat.
Wassalamualaikum Warohmatulloh Wabarokatuh.
Tinggalkan Balasan
Anda harus masuk untuk berkomentar.