Cara Menggunakan JWT (JSON Web Token) pada Lumen 5.8 dan PostgreSQL
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:
- PHP versi 7.1.3 keatas
- OpenSSL PHP Extension
- PDO PHP Extension
- 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 debugAvailable 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!