Panduan decode JWT untuk Android Developer

Guna Dermawan
3 min readDec 7, 2023

--

JWT, atau JSON Web Token, adalah standar terbuka (RFC 7519) yang mendefinisikan cara aman mentransfer informasi antar pihak sebagai objek JSON. Informasi ini dapat diverifikasi dan dipercayai karena ditandatangani secara digital. JWT biasanya digunakan untuk mentransfer klaim data antara dua pihak ketika mereka terlibat dalam pertukaran data. Token ini dapat digunakan untuk otentikasi dan pertukaran informasi terpercaya antara pihak-pihak yang terkait.

Jika kita sebagai developer android dan menemukan response dari API berupa JSON, kemudian kita ingin mendapatkan datanya untuk di simpan di penyimpanan lokal, maka kita perlu melakukan decode secara lokal di android sebelum menyimpan data yang ada didalam jwt, berikut adalah skenario singkatnya

Skenario Aplikasi

kita akan menambahkan fungsi autentikasi berupa login ke aplikasi kita, backend telah menyediakan URL dan response API, karena berisi informasi sensitif, seluruh data yang terkait untuk login pengguna di enkripsi dengan JWT, kemudian kita ingin ketika pengguna berhasil login, semua data yang berada didalam JWT dapat tersimpan ke penyimpanan lokal (kita gunakan sheared preference agar lebih sederhana), untuk itu, ketika kita melakukan pemanggilan API dan berhasil mendapatkan response berupa JWT, kita perlu melakukan decode, dan ketika decode berhasil, barulah kita dapat menyimpan data pengguna untuk kebutuhan lebih lanjut, mari kita selesaikan misi kita sekarang!

Untuk melakukan decode jwt, kita menggunakan library dari auth0, jadi kita samakan saja ya, kalo kamu mau pakai library lain, silahkan saja, tetapi mungkin akan ada sedikit perbedaan dalam penerapanya, kamu bisa cek website JSON Web Tokens — jwt.io untuk mencoba melakukan decode jwt secara online dan mengetahui isi dari JWT yang kamu perlukan untuk disimpan di penyimpanan lokal android

berikut adalah dummy jwt yang telah saya buat

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikd1bmEgRGVybWF3YW4iLCJpYXQiOjE1MTYyMzkwMjIsImFjY2Vzc190b2tlbiI6ImR1bW15X2FjY2Vzc190b2tlbiIsIm5pcCI6ImR1bW15X25pcCIsInJvbGUiOiJkdW1teV9yb2xlIn0.UVEVZNQEESvprk90uHmTZgi15e_8trLfr5CdzUo-UOI
isi dari payload jwt yang telah di decode

Tambahkan dependency berikut di build.gradle project android

com.auth0.android:jwtdecode:2.0.2

sesuikan dengan versi terbaru ya, di repository mereka disini, lakukan sinkronasi gradle.

Atur proses decode

saya asumsikan kamu udah punya activity login dan konfigurasi koneksi http di android ya, entah itu pakai retrofit, volley ataupun yang lainya, saya asumsikan juga kamu sudah melakukan konfigurasi terkait dengan logic di activity atau fragment android ya, jadi kita akan fokus cara decode nya saja.

Berikut adalah contoh dari Utils untuk decode jwt di android

fun saveTokenInfo(token: String) {
val jwt = JWT(token)
val editor = preferences.edit()
// default dari auth0 untuk konfigurasi jwt
editor.putString(PREF_SUBJECT, jwt.subject)
editor.putString(PREF_ISSUER, jwt.issuer)
editor.putStringSet(PREF_AUDIENCE, HashSet(jwt.audience))
editor.putLong(PREF_EXPIRES_AT, jwt.expiresAt?.time ?: 0)
editor.putLong(PREF_ISSUED_AT, jwt.issuedAt?.time ?: 0)
editor.putString(PREF_JWT_ID, jwt.id)

// sesuaikan getClaim("") dengan isi dari jwt
editor.putString(PREF_ROLE, jwt.getClaim("role").asString())
editor.putString(PREF_NIP, jwt.getClaim("nip").asString())
editor.putString(PREF_OFFICE_CODE, jwt.getClaim("kode_kantor").asString())
editor.putString(PREF_USERNAME, jwt.getClaim("preferred_username").asString())

editor.apply()
}

Gunakan Utils untuk decode JWT

Setalah kita membuat Utils, kita bisa menggunakannya ketika proses autentikasi yang memerlukan decode jwt, misalnya ketika user melakukan proses login, berikut adalah contoh kodenya

private fun authLogin(username: String, password: String) {

val apiService = ApiClient.apiService
val request = LoginRequest(username, password) // Gantilah dengan model yang sesuai

// coroutine scope
lifecycleScope.launch {
try {
val response = apiService.login(request)

if (response.status == "success") {
val accessToken = loginResponse.access_token
val expireIn = loginResponse.expires_in
val tokenManager = TokenManager(applicationContext)
// Simpan sesuai kebutuhan, misalnya untuk menyimpan akses token
tokenManager.saveTokenInfo(accessToken)

} catch (e: Exception) {
Toast.makeText(this@LoginActivity, "Error login: $e", Toast.LENGTH_SHORT).show()
tvErrorLogin.visibility = View.VISIBLE
tvErrorLogin.setText("Error login: $e")
} finally {
progressDialog.dismiss()
}
}
}

setelah proses decode berhasil, kamu bisa mengecek shared preferences (gunakan shared preferences yang terenkripsi jika datanya sensitif) dengan log android untuk memastikan data yang diperlukan pada proses decode token telah tersimpan.

itulah panduan singkat cara decode JWT di android, semoga bisa membantu kamu yang sedang ada kendala di proses decode jwt ya,

semangat belajar!

your friends,

Gun

--

--