解析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
|
手机号是否已验证
|