Membuat Api Laravel 5.3 dengan API Guard dan JWT
Saat pertama kali kenal dengan istilah API saya kira saat berhasil ngirim hasil berupa json atau XML sudah bisa membuat API, ternyata tak sesederhana itu. Dalam tulisan kali ini saya mau mencoba membuat service API sederhana dengan Laravel 5.3.
Persiapan
Yang perlu disiapkan adalah Laravel 5.3, dan paket tambahan yang dibutuhkan adalah :
Alur API
Di sini saya akan membuat 4 method dengan fungsi dan kriteria sebagai berikut :
- Fungsi ‘test-api’ yang beralamat di
tester.app/api/test-api
. Method ini diakses dengan ‘GET’ tanpa perlu ada autentikasi terlebih dahulu. - Fungsi ‘login’ yang beralamat di
tester.app/api/login
. Method ini diakses dengan ‘POST’ dengan sebelumnya menyertakan authentication key, hasil dari login akan menghasilkan ‘token’. - Fungsi ‘with-login’ yang beralamat di
tester.app/api/with-login
diakses dengan ‘GET’. Selain harus menyertakan authentication key method ini wajib menyertakan ‘token’ hasil login. - Fungsi ‘without-login’ yang beralamat di
tester.app/api/without-login
. Method ini diakses dengan ‘GET’ hanya perlu authentication key tanpa perlu ‘token’ login.
Memasang Paket
Saya berasumsi Laravel 5.3 sudah dipasang sebelumnya lengkap dengan tabel user, jadi langsung saja ke pemasangan paket.
Tambahkan dua paket ini di composer.json
"chrisbjr/api-guard": "3.1.*",
"tymon/jwt-auth": "0.5.*"
Lalu eksekusi perintah composer update
dan tunggu sampai selesai.
Konfigurasi
Buka config/app.php
pada bagian providers
tambahkan baris berikut :
'providers' => [
...
//guard
Chrisbjr\ApiGuard\Providers\ApiGuardServiceProvider::class,
//jwt auth
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
],
Dan di bagian aliases
tambahkan
'aliases' => [
...
'ApiGuardAuth' => \Chrisbjr\ApiGuard\Facades\ApiGuardAuth::class,
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class
],
Untuk konfigurasi API-Guard jalan perintah berikut di terminal
php artisan vendor:publish --provider="Chrisbjr\ApiGuard\Providers\ApiGuardServiceProvider"
Perintah tersebut akan menghasilkan berkas config/apiguard.php
dan migration
untuk tabel api_keys
& api_logs
.
Lakukan perintah php artisan migrate
untuk membuat tabel tersebut di database, selanjutnya jalankan perintah berikut di terminal php artisan api-key:generate --user-id=1
untuk membuat token bagi user dengan id = 1. Untuk membuat token via aplikasi/controller bisa menggunakan $apiKey = Chrisbjr\ApiGuard\Models\ApiKey::make()
.
Sedangkan untuk JWT gunakan perintah berikut :
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
php artisan jwt:generate
Setelah itu tambahkan beberapa baris di app/Http/Kernel.php
protected $routeMiddleware = [
...
'apiguard' => \Chrisbjr\ApiGuard\Http\Middleware\ApiGuard::class,
'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,
];
Konfigurasi selesai.
* Jika saat nge-publish dinyatakan tidak ada berkas yang di-publish jalankan dulu perintah berikut php artisan config:cache
atau php artisan config:clear
Menyiapkan Controller dan Routes
Jalankan perintah php artisan make:controller API/TestapiController
untuk membuat controller yang berada di app/Http/Controllers/API
. Sedangkan isi dari controller
tersebut sebagai berikut
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use Chrisbjr\ApiGuard\Http\Controllers\ApiGuardController;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class TestapiController extends ApiGuardController
{
protected $apiMethods = [
'testapi' => [
'keyAuthentication' => false
],
];
public function testapi()
{
return "ok";
}
public function index()
{
$user = User::all();
return $user;
}
public function login(Request $request)
{
// ambil request email dan password
$credentials = $request->only('email', 'password');
try {
// fungsi untuk melakukan login berdasarkan request yang diambil
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Email dan Password tidak sesuai'], 401);
}
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['error' => 'Terjadi kesalahan'], 500);
}
// all good so return the token
return response()->json(compact('token'));
}
}
Lalu buat routes
untuk API, di laravel 5.3 route API ada di routes/api.php
isi dari route tersebut seperti berikut
Route::get('/test-api', 'API\TestapiController@testapi');
Route::get('/without-login', 'API\TestapiController@index');
Route::get('/with-login', 'API\TestapiController@index')->middleware('jwt.auth');
Route::post('/login', 'API\TestapiController@login');
Untuk pengetasan API ini saya menggunakan aplikasi yang namanya Insomnia.
- Tes api tanpa authkey dan token.
Karena tanpa login dan authkey link ini bisa langsung di akses.
- Tes Api dengan authkey namun tanpa token.
Untuk bagian ini pada bagian headers perlu ditambahkan dulu Authkey
Setelah itu baru bisa digunakan untuk komunikasi API.
Fungsi ‘without-login’
Fungsi ‘login’
Tanpa ‘authkey’
Wajib menyertakan ‘token’
Fungsi ‘with-login’
Jika ‘token’ tidak disertakan
Selesai. Jika ada pertanyaan bisa komentar saja di bawah.
Referensi :
https://github.com/chrisbjr/api-guard
https://github.com/tymondesigns/jwt-auth/wiki/Installation