OIDC example code(不可用,帮理解)
gpt
是的,验证 ID Token 的签名不仅可以确认其真实性和完整性,还可以提取出其中的用户信息,包括用户的唯一标识符 (sub 字段)。
验签并提取用户信息的步骤
- 获取 Google 的公钥:从 Google 的 JWKS URI 获取公钥,用于验证 ID Token 的签名。
- 解析 ID Token:使用 JWT 库解析 ID Token,提取其中的用户信息。
- 验证签名:使用公钥验证 ID Token 的签名,确保其未被篡改。
以下是一个具体的例子,使用 Node.js 和 jsonwebtoken 库来验证 ID Token 并提取用户信息,包括用户的唯一标识符 (sub 字段)。
示例代码
const jwt = require('jsonwebtoken');
const jwksClient = require('jwks-rsa');
// 设置 JWKS 客户端
const client = jwksClient({
jwksUri: 'https://www.googleapis.com/oauth2/v3/certs',
});
// 获取密钥
function getKey(header, callback) {
client.getSigningKey(header.kid, function (err, key) {
if (err) {
callback(err);
return;
}
const signingKey = key.getPublicKey();
callback(null, signingKey);
});
}
// 验证 ID Token 并提取用户信息
const idToken = 'YOUR_ID_TOKEN_HERE';
jwt.verify(
idToken,
getKey,
{
algorithms: ['RS256'],
audience: 'YOUR_CLIENT_ID',
issuer: 'https://accounts.google.com',
},
function (err, decoded) {
if (err) {
console.error('Token verification failed:', err);
} else {
console.log('Token is valid:', decoded);
// 提取用户 ID
const userId = decoded.sub;
console.log('User ID:', userId);
}
}
);
解释
-
设置 JWKS 客户端:
- 使用
jwks-rsa库从 Google 的 JWKS URI 获取公钥。
- 使用
-
获取密钥:
getKey函数从 JWKS 客户端获取签名密钥。
-
验证 ID Token:
- 使用
jsonwebtoken库的verify方法验证 ID Token。需要指定算法(如RS256)、受众(audience,即你的客户端 ID)和签发者(issuer,即https://accounts.google.com)。
- 使用
-
提取用户信息:
- 如果验证成功,
decoded对象将包含 ID Token 的 payload,其中包括用户的唯一标识符 (sub字段)。
- 如果验证成功,
总结
通过上述步骤,你不仅可以验证 ID Token 的签名,还可以提取其中的用户信息,包括用户的唯一标识符 (sub 字段)。这在确保令牌真实性的同时,也能获取到用户的唯一标识,用于后续的用户管理和身份验证。