Android Kotlin环境下解码JWT提取用户id的实现方案
Android Kotlin 提取JWT内用户ID的实现方案
前置注意:你提供的JWT令牌开头存在多余的here前缀,解析前需要先移除该前缀,否则会解析失败。
方案1:使用JJWT库解析(推荐,稳定性高)
第一步:添加依赖
在模块级build.gradle.kts中引入JJWT相关依赖:
dependencies { implementation("io.jsonwebtoken:jjwt-api:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") }
第二步:解析代码实现
import io.jsonwebtoken.Jwts fun getUserIdFromJwt(jwtToken: String): Int? { return try { // 移除多余前缀 val cleanToken = jwtToken.removePrefix("here") // 解析载荷部分,若需要校验签名可传入对应的签名密钥 val claims = Jwts.parserBuilder() .build() .parseClaimsJwt(cleanToken) .body // 提取operador对象下的id字段 val operador = claims.get("operador", Map::class.java) operador["id"] as? Int } catch (e: Exception) { e.printStackTrace() // 解析失败返回空,可根据业务需求调整异常处理逻辑 null } }
方案2:手动解析(无额外依赖)
原理是JWT由.分割为三个部分,第二部分为Base64Url编码的载荷,解码后即可得到JSON格式的载荷内容:
import android.util.Base64 import org.json.JSONObject fun getUserIdFromJwtManual(jwtToken: String): Int? { return try { // 移除多余前缀 val cleanToken = jwtToken.removePrefix("here") // 拆分JWT的三个部分 val parts = cleanToken.split(".") if (parts.size < 2) return null // 处理Base64Url编码的填充问题 val payloadEncoded = parts[1] .replace('-', '+') .replace('_', '/') .padEnd((parts[1].length + 3) / 4 * 4, '=') // 解码为JSON字符串 val payloadJson = String(Base64.decode(payloadEncoded, Base64.DEFAULT)) // 解析JSON提取用户ID val jsonObject = JSONObject(payloadJson) val operador = jsonObject.getJSONObject("operador") operador.getInt("id") } catch (e: Exception) { e.printStackTrace() null } }
调用上述任意方法传入JWT字符串,即可得到Int类型的用户ID,可直接用于后续业务操作。
内容的提问来源于stack exchange,提问作者Gabriel Felski
相关产品推荐
相关产品推荐

