Pada artikel ini kita akan membahas terkait integrasi JWT Authorization & Validation dengan Krakend API Gateway, goalnya nanti validasi yang bisanaya dilakukan oleh backend akan sepenuhnya di handle oleh krakend dari awal. Sehingga setiap backend tidak memerlukan proses validasi ulang pada user yang melakukan login.
Jika kamu belum pernah melakukan installasi dan implementasi dasar krakend, maka kamu bisa coba baca artikel sebelumnya : Membangun API Gateway dengan Krakend
Contents
Pengenalan Singkat JWT
JWT (JSON Web Token) merupakan sebuah token yang menggunakan ekstensi JSON yang berbentuk string yang cukup random untuk dibaca, token ini nantinya digunakan untuk melakukan verifikasi data antar dua pihak atau lebih.
Meskipun berbentuk string yang random, JWT ini memiliki struktur yang menyimpan value didalamnya. Struktur tersebut dibagi menjadi 3 bagian yaitu header, payload dan Verify Signature.
Contoh Header JWT :
{
"alg": "HS256",
"kid": "default",
"typ": "JWT"
}
Contoh Payload JWT:
{
"sub": "12412511",
"username": "alpha",
"exp": "1232411"
}
Contoh Verify Signature JWT:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Jika ingin memahami lebih detail terkait dengan JWT, kamu dapat membaca dan menonton penjelasan dari referensi external berikut :
Untuk kamu yang seorang fullstack developer mungkin tidak asing dengan JWT validation ini, tapi kalau kamu seorang devops/sysadmin yang tiba-tiba disuruh setup JWT di API Gateway maka kamu perlu pelajari konsep JWT terlebih dahulu [curhat penulis 😝]
Goal
Tujuan akhir pada artikel ini sudah kita bahas diawal tulisan, yaitu membuat validasi JWT dilakukan diawal oleh API Gateway sehingga tidak perlu dilaukan kembali oleh setiap backend service, topologinya kurang lebih seperti berikut :

- Kita akan login terlebih dahulu ke service auth melalui Krakend
- Kita diberikan token yang diperoleh pada saat login
- Token digunakan untuk mengakses service lain melalui krakend
Installasi Backend Service
Pada artikel ini kita akan melakukan implementasi menggunakan service backend yang sudah saya sediakan, kamu dapat melakukan clone pada alamat git berikut : https://github.com/tresnax/backend-appjs.git
Selanjutnya masuk kedalam directory git yang sudah di clone, kita akan coba menjalankan service yang diperlukan, disini kita akan menggunakan service :
- Auth (untuk login dan generate token)
- course-list (untuk mengetes JWT)
- postgresql (untuk database user)
Pertama pastikan kita sudah membuat docker network dengan nama krakend-net, apabila belum maka bisa gunakan perintah berikut :
docker network create krakend-net
Setelah itu kita lakukan build image pada service yang akan kita gunakan :
docker build auth/ -t auth-jsapp:latest
docker build course-list/ -t course-jsapp:latest
Selanjutnya kita jalankan kedua backend dan juga database postgresql dengan menggunakan perintah docker-compose berikut :
docker-compose up -d auth-service course-service db-appservice
Tunggu hingga proses selesai dan check apakah kedua service sudah berjalan dengan perintah docker ps
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
auth-jsapp auth-jsapp:latest "node index.js" auth-service 44 seconds ago Up 42 seconds 0.0.0.0:8084->3000/tcp, :::8084->3000/tcp
course-jsapp course-jsapp:latest "node index.js" course-service 44 seconds ago Up 42 seconds 0.0.0.0:8082->3000/tcp, :::8082->3000/tcp
db-appservice postgres "docker-entrypoint.s…" db-appservice 44 seconds ago Up 42 seconds 5432/tcp
Apabila terjadi masalah, maka ulangi kembali step sebelumnya dan check bagain yang mungkin belum sesuai.
Konfigurasi Krakend
Selanjutnya kita akan lakukan konfigurasi krakend.json, untuk konfigurasi JWT Validation kita perlu menambahkan script berikut kedalam extra config dari endpoint yang ingin diberikan validasi:
"extra_config": {
"auth/validator": {
"alg": "HS256",
"jwk_local_path": "./jwk.json",
"cache": false,
"disable_jwk_security": true,
"operation_debug": true
}
}
Apabila kita lengkapi kedalam script krakend.json maka akan konfigurasi akan menjadi seperti berikut, contohnya kita akan validate di backend kursus :
{
"version": 3,
"output_encoding": "no-op",
"http_port": 8080,
"endpoints": [
{
"endpoint": "/login",
"method": "POST",
"backend": [
{
"url_pattern": "/login",
"method": "POST",
"host": ["http://auth-service:3000"]
}
]
},
{
"endpoint": "/kursus",
"method": "GET",
"extra_config": {
"auth/validator": {
"alg": "HS256",
"jwk_local_path": "./jwk.json",
"cache": false,
"disable_jwk_security": true,
"operation_debug": true
}
},
"concurrent_calls": 1,
"backend": [
{
"url_pattern": "/courses",
"method": "GET",
"host": ["http://course-service:3000"]
}
],
"headers_to_pass": ["Authorization"]
}
]
}
Masih di direktory yang sama dengan krakend.json, buat sebuah file baru dengan nama jwk.json. File ini nantinya menjadi credensial untuk melakukan validasi apakah token tersebut valid atau tidak :
{
"keys": [
{
"kid": "default",
"kty": "oct",
"k": "dGFodWJ1bGF0",
"alg": "HS256"
}
]
}
Keterangan
- kid : komponen header yang ada pada token jwt, ini harus ada pada backend yang men-generate token (auth)
- k : adalah credential/password yang di encode menggunakan base64, credential ini harus sama dengan backend auth juga. Untuk melakukan encode ke base64 kamu bisa gunakan web berikut sebagai alternative https://www.base64decode.org/
- alg : algoritma yang digunakan oleh token, secara default krakend menggunakan HS256 selain itu kamu dapat gunakan algorita support lainnya yaitu “EdDSA” , “HS256” , “HS384” , “HS512” , “RS256” , “RS384” , “RS512” , “ES256” , “ES384” , “ES512” , “PS256” , “PS384” dan “PS512”
Simpan dan jalankan krakend, atau buat ulang dengan docker menggunakan perintah berikut :
docker run -d --name krakend \
-v ./krakend/:/etc/krakend \
-p 8000:8000 \
-p 8080:8080 \
--network krakend-net devopsfaith/krakend
Pastikan bahwa container krakend sudah berjalan dan dapat kita lakukan pengujian. Untuk mendapatkan source code dari konfigurasi krakend, kamu dapat mengakses repo github yang saya buat juga disini : https://github.com/tresnax/tutorial-krakend.git
Pengujian
Untuk melakukan pengujian, kita dapat menggunakan Postman atau Insomnia dengan memasukan alamat dari Krakend API Gateway yaitu localhost:8080 setelah itu tambahkan enpoint dari backend service yang kita tuju.
Login Test
Pertama kita akan melakukan test login, dengan mengakses alamat url dari login dan mendapatkan token yang akan digunakan untuk mengakses ke api kursus.
Pastikan untuk mengisi body dengan JSON berikut :
{
"username": "alpha",
"password": "alpha"
}
Notes
- Pada database postgresql sudah tersedia user dengan nama alpha, beta, clara, delta dengan password sama yang dapat kamu coba.
Setelah itu akses alamat localhost:8080/login dengan methode POST dan lihat hasilnya akan memuncukan token, copy token tersebut.

Validate Test
Kedua kita akan coba melakukan validasi token dengan mengakses alamat api dari kursus yaitu localhost:8080/kursus dengan methode GET.
Apabila kamu belum measukan token kedalam header, maka akan muncul error 401 Unauthorized seperti berikut :

Untuk mengatasinya, kita masuk kebagian Auth dan pilih Bearer lalu masukan token yang sudah kita salin tadi pada saat melakukan login kedalam Bearer Auth dan check maka hasilnya akan seperti berikut :

Kamu dapat menyesuakan script validate sebelumnya kedalam endpoint backend lain yang kamu butuhkan untuk JWT.
Penutup
Panduan di atas hanyalah konfigurasi sederhana dari JWT Validation Krakend, masih banyak parameter lain yang dapat kamu sesuaikan lagi sesuai dengan kebutuhan masing-masing. Dan pastikan secret yang kamu miliki cukup secure untuk digunakan apabila sudah memasuki production
Untuk informasi lebih detail mengenai JWT Validation, kamu dapat membaca official dokumentasi dari krakend berikut : JWT Validation with Krakend
Referensi
- https://www.krakend.io/docs/authorization/jwt-validation/
- https://github.com/AamirNawaz/krakend_with_backend_srv
- https://www.codepolitan.com/blog/kenalan-yuk-dengan-json-web-token-jwt/
- https://www.krakend.io/docs/authorization/jwt-validation/
- https://www.youtube.com/watch?v=3896v59PE4w&list=PLRvQJHX4HOd723jUhwecqWc60Z4Tw6_vc&index=17
- https://www.youtube.com/watch?v=3FzuHlWqDfQ&t=598s&ab_channel=MuhammadAfifudin