Menggunakan Jwt Untuk Authentication di Api Lumen
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“