Membangun API Laravel yang Aman dengan Otentikasi JWT
Ketika membangun API dengan Laravel, memastikan autentikasi yang aman sangatlah penting, terutama ketika berurusan dengan data pengguna. JSON Web Token (JWT) menawarkan metode yang kuat untuk menangani autentikasi dalam aplikasi tanpa kewarganegaraan, yang memungkinkan pengiriman informasi pengguna yang aman antar pihak. Panduan ini akan memandu Anda melalui proses membangun API Laravel yang aman menggunakan autentikasi JWT.
Prasyarat
- Pengetahuan dasar tentang PHP dan Laravel.
- Laravel terinstal di komputer Anda (sebaiknya Laravel 9 atau yang lebih baru).
- Komposer sudah terinstal.
- MySQL atau basis data lain yang disiapkan untuk aplikasi Anda.
Langkah 1: Membuat Proyek Laravel Baru
Pertama, buatlah proyek Laravel baru menggunakan Composer:
composer create-project laravel/laravel laravel-jwt-api
Arahkan ke direktori proyek Anda:
cd laravel-jwt-api
Langkah 2: Instal Paket Otentikasi JWT
Paket yang paling umum digunakan untuk otentikasi JWT di Laravel adalah tymon/jwt-auth. Instal paket ini menggunakan Composer:
composer require tymon/jwt-auth
Setelah instalasi paket, publikasikan konfigurasi JWT:
php artisan vendor:publish --provider ="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Ini akan membuat berkas config/jwt.php di dalam proyek Anda.
Langkah 3: Membuat Kunci Rahasia JWT
Buatlah kunci rahasia yang akan digunakan JWT untuk menandatangani token:
php artisan jwt:secret
Ini akan menambahkan entri JWT_SECRET ke berkas .env Anda, yang digunakan untuk menyandikan dan mendekodekan token.
Langkah 4: Siapkan Otentikasi
Untuk menyiapkan autentikasi JWT, Anda perlu mengonfigurasi penjaga default untuk API Anda. Perbarui berkas config/auth.php sebagai berikut:
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
Langkah 5: Membuat Model Pengguna dan Migrasi
Jika Anda belum membuat model User, Anda dapat membuatnya bersama dengan berkas migrasinya:
php artisan make:model User -m
Buka file migrasi yang telah dibuat di database/migrations/ dan tambahkan kolom yang diperlukan, seperti nama, email, dan kata sandi:
public function up()
{
Schema::create('users', function (Cetak Biru $tabel) {
$table->id();
$tabel->string('nama');
$tabel->string('email')->unique();
$tabel->string('password');
$tabel->stempel waktu();
});
}
Jalankan migrasi untuk membuat tabel pengguna:
php artisan migrasi
Langkah 6: Menerapkan Metode JWT dalam Model Pengguna
Dalam model Pengguna(app/Models/User.php), implementasikan antarmuka JWTSubject dan metode yang diperlukan:
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject
{
public function getJWTIdentifier()
{
return $this->getKey(); // Usually the primary key (id)
}
public function getJWTCustomClaims()
{
return [];
}
}
Langkah 7: Membuat Pengontrol Autentikasi
Buat pengontrol untuk menangani autentikasi pengguna:
php artisan make:controller AuthController
Di dalam AuthController.php, tambahkan metode untuk mendaftarkan pengguna, masuk, dan keluar:
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
$token = JWTAuth::fromUser($user);
return response()->json(['token' => $token], 201);
}
// User Login
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = Auth::attempt($credentials)) {
return response()->json(['error' => 'Invalid credentials'], 401);
}
return response()->json(['token' => $token]);
}
// Logout User (Invalidate Token)
public function logout()
{
Auth::logout();
return response()->json(['message' => 'Successfully logged out']);
}
// Get Authenticated User
public function me()
{
return response()->json(Auth::user());
}
}
Langkah 8: Tentukan Rute API
Tambahkan rute untuk autentikasi di routes/api.php:
use App\Http\Controllers\AuthController;
use Illuminate\Support\Facades\Route;
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
// Protected routes (require JWT token)
Route::middleware('auth:api')->group(function () {
Route::post('logout', [AuthController::class, 'logout']);
Route::get('me', [AuthController::class, 'me']);
});
Rute ini menangani pendaftaran pengguna, masuk, keluar, dan mengambil pengguna yang diautentikasi.
Langkah 9: Melindungi Rute API
Untuk melindungi rute API lainnya, Anda dapat menggunakan middleware auth:api. Misalnya, jika Anda memiliki rute sumber daya untuk posting:
Route::middleware('auth:api')->group(function () {
Route::resource('posts', PostController::class);
});
Hal ini memastikan bahwa hanya pengguna yang terautentikasi yang dapat mengakses rute ini.
Langkah 10: Menguji API
Anda bisa menguji API Anda menggunakan alat seperti Postman atau cURL.
- Daftarkan pengguna:
POST /api/register
Host: your-domain.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"password": "password",
"password_confirmation": "password"
} - Masuk:
POST /api/login
Host: your-domain.com
Content-Type: application/json
{
"email": "john@example.com",
"password": "password"
}Ini akan mengembalikan token yang dapat Anda gunakan untuk mengautentikasi permintaan lainnya. - Mengakses rute yang dilindungi: Untuk mengakses rute yang dilindungi seperti GET /api/me, sertakan token di header Otorisasi:
Otorisasi: Pembawa
Langkah 11: Menyegarkan Token JWT (Opsional)
Untuk menyegarkan token, Anda dapat menambahkan sebuah metode di AuthController:
public function refresh()
{
$token = Auth::refresh();
return response()->json(['token' => $token]);
}
Tambahkan rute untuk penyegaran:
Route::post('refresh', [AuthController::class, 'refresh'])->middleware('auth:api');
Kesimpulan
Dengan mengikuti panduan ini, Anda telah membangun API Laravel yang aman dengan autentikasi JWT, yang memungkinkan registrasi pengguna, login, dan akses ke rute yang dilindungi. JWT memungkinkan Anda untuk mempertahankan mekanisme autentikasi tanpa kewarganegaraan, yang sangat berguna untuk menskalakan API. Dengan pengaturan ini, Anda dapat menyesuaikan logika autentikasi aplikasi Anda lebih lanjut dan mengintegrasikan fitur-fitur tambahan, seperti kontrol akses berbasis peran dan menyegarkan token untuk sesi yang berumur panjang.