我在这里尝试使用 google OAuth 在我的 node express 应用程序中对用户进行身份验证时遇到了很多麻烦。我可以成功执行 OAuth,它返回如下响应:
{
access_token: 'token string',
id_token: 'id.string',
expires_in: 3599,
token_type: "Bearer"
}
这一切都是有道理的,但我一生都无法弄清楚如何解码 JWT。我对这一切有点缺乏经验,所以这对我来说有点陌生。
按照此处列出的说明:https ://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken我正在尝试在我的节点应用程序中本地解码 JWT。
我在我的节点环境中安装了https://github.com/hokaccha/node-jwt-simple 。
而且我很确定我需要在所有这些中使用这个证书(https://www.googleapis.com/oauth2/v1/certs)来解码它,但我在这里有点茫然。我真的不明白如何将证书放入我的节点应用程序,然后如何将它与 node-jwt-simple 一起使用。而且我也不太明白我如何知道何时需要提取新证书,而不是使用缓存的证书。
有这方面经验的人可以帮助我吗?
谢谢你的帮助。在这一点上,我完全不知所措。
** 更新 **
所以我取得了一些进展......有点。通过调用 jwt.decode(id_token, certificate, true); 我能够成功解码令牌。即使证书 var 是一个空对象 {}。这给我留下了 3 个问题。1:使用谷歌的 url 将证书放入我的 express 应用程序的最佳方法是什么?2:我怎么知道什么时候需要引入它的新版本?3:似乎为 noVerify (jwt.decode 中的第三个参数)传递 true 是一个糟糕的主意。如果不通过它,我怎样才能让它工作?看起来 jwt-simple 可能期待 hs256 并且令牌正在使用 rs256。
再说一次,我在这方面非常缺乏经验,所以我可能离这里很远。
* 更新 * 感谢 Nat 的帮助,我得以完成这项工作!我想我尝试了每一个 JWT 和 JWS 节点模块。我最终得到的结果如下:我发现我看到的所有模块都没有达到我想要的开箱即用的效果。我创建了以下用于解码 id_token 的 jwt 解码辅助方法,因此我可以从标题中获取孩子。
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) 来验证签名!
万岁!再次感谢您在回复中提供的额外解释。这在帮助我理解我什至试图做的事情方面大有帮助。希望这对其他人也有帮助。