4 min read

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 :

  1. Api Guard
  2. JWT

Alur API

Di sini saya akan membuat 4 method dengan fungsi dan kriteria sebagai berikut :

  1. Fungsi ‘test-api’ yang beralamat di tester.app/api/test-api. Method ini diakses dengan ‘GET’ tanpa perlu ada autentikasi terlebih dahulu.
  2. 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’.
  3. 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.
  4. 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=1untuk 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