Menggunakan Jwt Untuk Authentication di Api Lumen

coin token Photo by ZSun Fu on Unsplash

Banyak teknik untuk melakukan proses otentikasi terhadap request User sebelum bisa dilanjutkan ke proses core system kita, yang paling umum digunakan adalah dengan menggunakan JWT. JWT adalah metode terstandar RFC 7519 untuk merepresentasikan kunci keamanan antara dua pihak (contoh: Server — Client / Backend — Frontend). Data JWT bersifat self contained yang bisa di-generate, di-decode, dan di-verify.

Kenapa saya mencontohkan penggunaannya pada lumen? sebetulnya JWT bisa digunakan untuk banyak hal, karena restful API itu stateless (maka bisa memanfaatkan JWT karena *self contained *nya) dan framework yang cukup populer adalah lumen dari laravel. Disini saya menggunakan lumen 5.6.


Mari Kita Mulai

Saya asumsikan lumen sudah terpasang dan sekarang hanya tinggal install jwt dari firebase.

composer require firebase/php-jwt

Setelah terinstall, siapkan code pada core logic API login kita.

Karena JWT membutuhkan secret key untuk verifikasi, maka kita bisa generate random string dengan panjang 32 character, misal menggunakan

str_random(32);

dan simpan pada environment file (.env). misal dengan nama JWT_SECRET.

Generate Token

Pada contoh UserController.php, ketika kita generate JWT token dengan function encode()mengirimkan parameter payload dan secret key yang telah kita buat sebelumnya. Data payload sendiri sebetulnya bebas kita set atau namai. tapi dari situs resmi nya ada rekomendasi standar payload, yaitu ada 4 payload key ( iss (issuer), exp (expiration time), sub (subject), aud (audience)) dan menggunakan 3 karakter key agar tetap ringan.

Karena JWT itu self contained dan bisa didecode tanpa secret key, jadi jangan pernah memasukan data credential dan data penting lainnya pada payload. Masukan hanya data umum yang dibutuhkan saja, yang lainnya bisa ambil dari database di backend.

Secret key hanya kunci untuk mengecek keaslian (misal : mencegah dari adanya modifikasi (MITM:Man In The Middle attack) terhadap token), bukan kunci untuk decode token.

Terakhir kita return data tersebut sebagai response untuk client atau front end. Untuk menyimpan token di frontend yang paling mudah adalah di SharedPreferences untuk Android dan di local storage untuk browser.


Http Request Preparation

Di frontend kita siapkan http request dengan headers authorization bearer token. Misal untuk vue yang menggunakan axios :

Atau jika di Android menggunakan Fast Android Network :

ANRequest.GetRequestBuilder fan = new ANRequest.GetRequestBuilder(your-api-url);

fan.addHeaders("Authorization", "Bearer " + MyPreferences.getToken(getActivity()));

Authentification & Verification

Saatnya menyiapkan token verification di lumen. Agar setiap request melalui tahap pengecekan token, maka kita harus menggunakan middleware. Contoh saja kita membuat middleware bernama JWTMiddleware.

Di lumen kita dapat dengan mudah mengambil data header bearer token dengan fungsi $request->bearerToken().JWTMiddleware ini mengecek keberadaan bearer token dan melakukan verifikasi keasliannya dengan fungsi decode()yang menerima 3 parameter, pertama token itu sendiri, kedua secret key (JWT_SECRET), ketiga algoritma yang digunakan. Pilihan algoritma yang didukung adalah ‘HS256’, ‘HS384’, ‘HS512’ and ‘RS256’.

Lalu kita register JWTMiddleware sebagai routeMiddleware pada file bootstrap/app.php

$app->routeMiddleware([
    ...
    'jwt.auth' => App\Http\Middleware\JWTMiddleware::class,
]);

Lalu terakhir, pada file routes/web.php gabungkan semua route yang membutuhkan authentication jwt.

$router->group(['middleware' => 'jwt.auth'], function() use ($router) {
    ...
    //put your routes here
});

Begitulah JWT authentication beraksi pada lumen. Bila ada kritik dan saran boleh tuangkan saja di komentar. Bila tulisan ini bermanfaat bagi anda, bantu share ya.

Saya cukupkan sesi tulisan ini. Terima kasih sudah berkunjung.
#staypositive

Ciao!

This article was originally posted on Medium.com as Menggunakan JWT Untuk Authentication di API Lumen


comments powered by Disqus