Cara Menggunakan JWT (JSON Web Token) pada Lumen 5.8 dan PostgreSQL

Ridho Febriansa
4 min readJul 27, 2019
Logo Lumen

JWT atau JSON Web Token merupakan salah satu library yang dapat digunakan untuk membantu developer dalam melakukan autentifikasi dan autorisasi pada aplikasi berbasis web API.

Referensi untuk menggunakan JWT pada Lumen sebetulnya sudah banyak. Namun kebanyakan referensi menggunakan Lumen versi 5.7 kebawah. Sedangkan jika menggunakan referensi tersebut pada Lumen versi 5.8, akan menimbulkan error berikut (referensi) :

Type error: Argument 1 passed to Tymon\JWTAuth\JWT::fromUser() must be an instance of Tymon\JWTAuth\Contracts\JWTSubject, instance of App\User given

Namun, sayangnya solusi yang ditawarkan oleh para pengguna forum sangat outdated (ketinggalan jaman), sehingga solusi tersebut tidak dapat menyelesaikan masalah pada Lumen 5.8. Oleh karena itu, tutorial ini menjadi jembatan untuk menyelesaikan masalah tersebut sekaligus membantu teman-teman yang ingin menggunakan JWT pada Lumen 5.8

Langkah Pertama: Buat Project Baru

Untuk membuat project baru, pastikan environment anda memenuhi requirements yang dimiliki oleh Lumen:

  1. PHP versi 7.1.3 keatas
  2. OpenSSL PHP Extension
  3. PDO PHP Extension
  4. Mbstring PHP Extension

Lalu untuk menginstall Lumen, anda perlu download composer terlebih dahulu disini.

Untuk menginstall Lumen, jalankan perintah berikut:

composer global require “laravel/lumen-installer”

Untuk memastikan Lumen berhasil terinstall atau tidak, jalankan perintah berikut:

lumen

maka akan menghasilkan output berikut jika berhasil:

Lumen Installer 1.0.2

Usage:
command [options] [arguments]

Options:
-h, — help Display this help message
-q, — quiet Do not output any message
-V, — version Display this application version
— ansi Force ANSI output
— no-ansi Disable ANSI output
-n, — no-interaction Do not ask any interactive question
-v|vv|vvv, — verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
help Displays help for a command
list Lists commands
new Create a new Lumen application.

lalu untuk membuat project baru, jalankan perintah berikut:

lumen new nama_project

ganti nama_project sesuai dengan nama project yang ingin anda buat.

lalu gunakan command prompt / terminal untuk masuk ke dalam folder project tersebut, dan buka project tersebut gunakan text editor yang anda sukai (Sublime Text 3 / Visual Code).

Langkah Kedua: Setup PostgreSQL pada Lumen

Untuk mempermudah proses setup PostgreSQL pada Lumen, sebetulnya saya sudah menyiapkan repository pada GitHub yang berisi project Lumen versi 5.8 dan sudah terintegrasi dengan PostgreSQL. Anda bisa clone project saya dengan cara download manual / menggunakan git clone.

Untuk proses setup juga telah tertulis di dokumentasi GitHub, sehingga silahkan diunduh dan dicoba hingga proses migration berhasil.

Url GitHub: https://github.com/ridhof/lumen-postgresql-sample

Langkah Ketiga: Setup JWT pada Lumen dan PostgreSQL

Pertama — Import library jwt-auth pada project dengan menjalankan perintah berikut:

composer require tymon/jwt-auth:1.0.0-rc.4.1

Kedua — ubah file bootstrap/app.php menjadi sebagai berikut:

hapus komen pada baris yang berisi:

$app->withFacades();
$app->withEloquent();

$app->routeMiddleware([
‘auth’ => App\Http\Middleware\Authenticate::class,
]);

$app->register(App\Providers\AuthServiceProvider::class);

lalu tambahkan baris berikut pada kumpulan baris $app->register yang lain

$app->register(App\Providers\AuthServiceProvider::class);

Ketiga — ubah isi pada function boot yang terdapat di file app/Providers/AuthServiceProvider menjadi sebagai berikut:

public function boot()
{
$this->app[‘auth’]->viaRequest(‘api’, function ($request) {
return app(‘auth’)->setRequest($request)->user();
});
}

Keempat — jalankan perintah berikut untuk menambahkan variable secret key dari JWT pada file .env

php artisan jwt:secret

Kelima — buat folder bernama config yang sejajar dengan folder app. Lalu buat file bernama auth.php di dalam folder config yang berisi sebagai berikut:

Keenam — untuk melakukan testing JWT, buat route login yang mengembalikan nilai token dari JWT ketika user berhasil login dengan mengubah file routes/web.php menjadi sebagai berikut:

Ketujuh — lalu buat migration user baru yang pada fungsi up berisi berikut:

Schema::create(‘users’, function (Blueprint $table) {
$table->increments(‘id’);
$table->string(‘name’);
$table->string(‘email’);
$table->string(‘password’);
$table->timestamps();
});

Lalu jalankan perintah php artisan migrate untuk memeriksa apakah migrasi berhasil dijalankan atau tidak.

Kedelapan — buat/ubah model User pada file app/User.php sehingga menjadi berikut:

Kesembilan — Buat seeder supaya kita bisa melakukan testing apakah JWT dapat mengembalikan token jika user yang diberikan sudah tepat sesuai yang di database. Untuk membuat seeder, panggil perintah berikut:

php artisan make:seeder UsersTableSeeder

Lalu pada file database/seed/UsersTableSeeder.php pada fungsi run isi dengan kode berikut:

DB::table(‘users’)->insert([

‘name’ => ‘test’,

‘email’ => ‘test@gmail.com’,

‘password’ => app(‘hash’)->make(‘test’),

]);

Lalu panggil perintah berikut setiap kali selesai membuat seeder:

composer dump-autoload

Lalu jalankan seeder dengan memanggil perintah berikut:

php artisan db:seed — class=UsersTableSeeder

Langkah Keempat: Testing

Untuk melakukan testing, jalankan project Lumen dengan menggunakan perintah berikut:

php -S localhost:8000 -t public

Lalu kunjungi link berikut:

http://localhost:8000/login?email=tes@gmail.com&password=tes

maka, seharusnya jika berhasil, pada halaman website akan mengembalikan token seperti berikut:

{“token”:”eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODAwNFwvbG9naW4iLCJpYXQiOjE1NDc2MDQwNDIsImV4cCI6MTU0NzYwNzY0MiwibmJmIjoxNTQ3NjA0MDQyLCJqdGkiOiJSU2tkemczY01Wd3BiQ3h3Iiwic3ViIjo0MzMsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.2WyL1pidGWRKZrYsGiIHdiG5NFPDwOXLL0FY0xIO4QM”}

Kini project Lumen kita sudah dapat mengimplementasi JWT dengan menggunakan database PostgreSQL. Sekarang, kita dapat mengimplementasi token yang kita dapatkan pada project kita dengan menyimpan di database lalu melakukan pengecekan setiap kali ada request baru.

Selamat bereksperimen!

Referensi

  1. Dokumentasi Lumen
  2. Menggunakan JWT sebagai auth token pada Lumen 5.7
  3. GitHub jwt-auth issues #1094
  4. Dokumentasi jwt-auth
  5. Lumen JWT Sample Project oleh utpalkantkumar

--

--

Ridho Febriansa

Product Engineer and Associate Product Manager in training, pursuing a healthier life.