我在这里尝试在我的Node Express应用程序中使用Google OAuth来验证用户,但是遇到了很大的问题。我可以成功地进行OAuth,返回一个类似于下面这样的响应:
{
access_token: 'token string',
id_token: 'id.string',
expires_in: 3599,
token_type: "Bearer"
}
这都有道理,但我怎么也想不出如何解码JWT。我在这方面有些经验不足,所以这对我来说都有点陌生。按照此处列出的说明:https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken,我正在尝试在我的Node应用程序中本地解码JWT。我在我的Node环境中安装了https://github.com/hokaccha/node-jwt-simple。我非常确定我需要在所有这些操作中使用此证书(https://www.googleapis.com/oauth2/v1/certs)来解码它,但是我在这里有点迷失了。我真的不明白如何将证书导入我的Node应用程序,然后如何与node-jwt-simple一起使用它。我也不太明白如何知道何时需要拉取新证书,而不是使用已缓存的证书。有没有什么人有相关经验可以帮帮我?感谢任何帮助,我完全迷失了。*更新*
多亏了Nat的帮助,我终于搞定了!我觉得我尝试了每个可用的JWT和JWS节点模块。我最终采用的是以下方法:我发现我看过的所有模块都不能完全满足我的需求。我创建了下面这些jwt解码帮助方法,用于解码id_token,以便我可以从标头中获取kid。
module.exports = {
decodeJwt: function (token) {
var segments = token.split('.');
if (segments.length !== 3) {
throw new Error('Not enough or too many segments');
}
// All segment should be base64
var headerSeg = segments[0];
var payloadSeg = segments[1];
var signatureSeg = segments[2];
// base64 decode and parse JSON
var header = JSON.parse(base64urlDecode(headerSeg));
var payload = JSON.parse(base64urlDecode(payloadSeg));
return {
header: header,
payload: payload,
signature: signatureSeg
}
}
}
function base64urlDecode(str) {
return new Buffer(base64urlUnescape(str), 'base64').toString();
};
function base64urlUnescape(str) {
str += Array(5 - str.length % 4).join('=');
return str.replace(/\-/g, '+').replace(/_/g, '/');
}
我使用这个解码来确定是否需要从以下网址获取新的公共证书:https://www.googleapis.com/oauth2/v1/certs
然后,我使用该公共证书和node-jws (https://github.com/brianloveswords/node-jws)的 jws.verify(id_token, cert) 来验证签名!
太好了!感谢您在回复中提供的额外解释。对我理解自己正在尝试做什么非常有帮助。希望这也可以帮助其他人。
id_token
? - mesqueeb