You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:42:01