解析id_token获取用户信息

发布时间:2025-03-08 13:02:54     来源: 亿登科技
 
亿登IDaaS返回给应用的id_token,是符合 JWS (JSON Web Signature) 标准 的 JWT 令牌,应用侧须按以下三步获取用户信息。
 
若您使用java进行开发,首先在pom.xml中引入依赖
<dependency>
    <groupId>com.nimbusds</groupId>
    <artifactId>nimbus-jose-jwt</artifactId>
    <version>9.16.1</version>
</dependency>
 
第1步:获取应用公钥
GET https://idaas-api.yidengtech.com/third/oidc/v1/{app_id}/token/key
public List getPublicKeys(String url) throws ParseException {
    String result = HttpRequest.doGet(url, null);
    JSONObject jsonObject = JSON.parseObject(result);
    JSONArray keys = jsonObject.getJSONArray("keys");
    List rsaKeyList = new ArrayList();
    for (Object object:keys) {
        RSAKey rsaKey = RSAKey.parse(JSONObject.toJSONString(object));
        rsaKeyList.add(rsaKey);
    }
    return rsaKeyList;
}
 
第2步:签名验证
public boolean signVerify(String idToken, String url) {
    try {
        JWT jwtToken = JWTParser.parse(idToken);
        SignedJWT jwt = (SignedJWT)jwtToken;
        List publicKeyList = getPublicKeys(url);
        RSAKey rsaKey = null;
        for (RSAKey key : publicKeyList) {
            if (jwt.getHeader().getKeyID().equals(key.getKeyID())) {
                rsaKey = key;
            }
        }
        if (rsaKey == null) {
            return false;
        }
        RSASSAVerifier verifier = new RSASSAVerifier(rsaKey.toRSAPublicKey());
        return jwt.verify(verifier);
    } catch (Exception e) {
        log.error("",e);
        return false;
    }
}
 
第3步:解析用户信息
id_token由三部分用点号(.)连接而成:Header.Payload.Signature,对 Payload 部分进行 Base64Url 解码,即可获取用户信息。
组成部分
说明
编码方式
Header
包含令牌的元数据(签名算法、密钥ID等)
Base64Url 编码的 JSON
Payload
包含用户身份信息和令牌声明
Base64Url 编码的 JSON
Signature
签名值,用于验证令牌的完整性和真实性
Base64Url 编码的二进制数据
 
Header (头部)
{
  "kid": "app_0f9952fa24984a7fb7ac93e99f0ea249",
  "alg": "RS256"
}
 
Payload (负载)
{
  "at_hash": "zHAi9apwXx5-9Qd1_8gWAA",
  "sub": "user_4cc4cbefeba3461f874615e1c9a074e8",
  "email_verified": "false",
  "iss": "https://idaas-api.yidengtech.com/third/oidc/v1/app_0f9952fa24984a7fb7ac93e99f0ea249",
  "phone_number_verified": "false",
  "preferred_username": "liuyuting",
  "display_name": "刘雨婷",
  "aud": "app_0f9952fa24984a7fb7ac93e99f0ea249",
  "phone_number": "138xxxxxxxx",
  "exp": 1772118752,
  "iat": 1772117732,
  "jti": "dea9dffd0eec4964bd95479f6b3dadf2",
  "email": "",
  "username": "liuyuting"
}
 
? 字段说明
标准 OIDC Claims
字段
说明
iss
https://idaas-api.yidengtech.com/third/oidc/v1/app_0f9952fa24984a7fb7ac93e99f0ea249
令牌签发人(IDP 地址 + 应用标识)
aud
app_0f9952fa24984a7fb7ac93e99f0ea249
令牌接收者(应用的 Client ID)
sub
user_4cc4cbefeba3461f874615e1c9a074e8
用户唯一标识
exp
1772118752
过期时间:2026-03-03 10:32:32 UTC
iat
1772117732
签发时间:2026-03-03 10:15:32 UTC
jti
dea9dffd0eec4964bd95479f6b3dadf2
令牌唯一ID(防重放)
at_hash
zHAi9apwXx5-9Qd1_8gWAA
Access Token 的哈希值
 
用户信息 Claims
字段
说明
username
liuyuting
用户账号
preferred_username
liuyuting
偏好用户名
display_name
刘雨婷
显示名称
email
liuyuting@xxx.com
邮箱
email_verified
false
邮箱是否已验证
phone_number
138xxxxxxxx
手机号
phone_number_verified
false
手机号是否已验证
 
×
Copyright © 2022-2024 亿登科技 版权所有 京ICP备2024067475号-2 https://www.yidengtech.com