gpt4 book ai didi

google-authentication - 我可以为 Google OpenIDConnect id_token 获得一致的 'iss' 值吗?

转载 作者:行者123 更新时间:2023-12-03 07:29:22 25 4
gpt4 key购买 nike

我正在使用 Google's OpenIDConnect authentication ,我想验证 JWT id_token从谷歌返回。但是,文档似乎与 Google 为 iss 返回的值不一致。 (发行者)在 ID token 中声明。

One page说,“ iss: 总是accounts.google.com”,但是another page说“ID token 中 iss 的值等于 accounts.google.comhttps://accounts.google.com”,示例代码中的注释进一步解释了:

// If you retrieved the token on Android using the Play Services 8.3 API or newer, set
// the issuer to "https://accounts.google.com". Otherwise, set the issuer to
// "accounts.google.com". If you need to verify tokens from multiple sources, build
// a GoogleIdTokenVerifier for each issuer and try them both.

我有一个服务器端应用程序,而不是一个 Android 应用程序,所以我没有使用 Play 服务。

进一步搅浑水, the OpenIDConnect specification itself包含一个注释:

Implementers may want to be aware that, as of the time of this writing, Google's deployed OpenID Connect implementation issues ID Tokens that omit the required https:// scheme prefix from the iss (issuer) Claim Value. Relying Party implementations wishing to work with Google will therefore need to have code to work around this, until such time as their implementation is updated. Any such workaround code should be written in a manner that will not break at such point Google adds the missing prefix to their issuer values.



该文件的日期为 2014 年 11 月 8 日。从那时起,Google 已将 iss 标准化。值(value),还是我真的需要检查它们?上面的评论似乎表明只有 Play Services >=8.3 获得 isshttps:// , 其他地方的值将只是 accounts.google.com .真的吗?

最佳答案

您必须检查这两种可能性。这对我有用...

解码 token 以获取发行者。如果发行人不等于 https://accounts.google.com 中的任何一个或 accounts.google.com你可以停在那里。这是一个无效的 token 。

如果发行者等于上述 Google 字符串中的任何一个,则将相同的解码发行者值传递到验证步骤。

以下是我用 JavaScript 为某些 Node.js Express 中间件编写的实现:

function authorize(req, res, next) {
try {
var token = req.headers.authorization;
var decoded = jwt.decode(token, { complete: true });
var keyID = decoded.header.kid;
var algorithm = decoded.header.alg;
var pem = getPem(keyID);
var iss = decoded.payload.iss;

if (iss === 'accounts.google.com' || iss === 'https://accounts.google.com') {
var options = {
audience: CLIENT_ID,
issuer: iss,
algorithms: [algorithm]
}

jwt.verify(token, pem, options, function(err) {
if (err) {
res.writeHead(401);
res.end();
} else {
next();
}
});

} else {
res.writeHead(401);
res.end();
}
} catch (err) {
res.writeHead(401);
res.end();
}
}

注意这个函数使用 jsonwebtokenjwk-to-pem节点模 block 。我省略了 getPem 的细节最终将 json web key 转换为 pem 格式的函数。

关于google-authentication - 我可以为 Google OpenIDConnect id_token 获得一致的 'iss' 值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38618826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com