如何解码一个节点应用程序中的谷歌OAuth 2.0 JWT(OpenID连接)?
我有一段时间在这里尝试使用谷歌OAuthauthentication我的节点快递应用程序中的用户。 我可以成功地完成OAuth,它将返回如下响应:
{ access_token: 'token string', id_token: 'id.string', expires_in: 3599, token_type: "Bearer" }
这一切都是有道理的,但我不能为我的生活弄清楚如何解码智威汤逊。 所有这些我都没有经验,所以这对我来说有点陌生。
按照此处列出的说明: https : //developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken我试图在我的节点应用程序本地解码智威汤逊。
我在我的节点环境中安装了https://github.com/hokaccha/node-jwt-simple 。
而且我很确定我需要使用这个证书( https://www.googleapis.com/oauth2/v1/certs )来解码它,但是我在这里有点遗憾。 我真的不知道如何将证书放入我的节点应用程序,之后如何与node-jwt-simple一起使用它。 而且我也不是很了解我怎么知道什么时候需要提交新的证书,而不是使用caching的证书。
有人在这里有一些经验,可以帮助我吗?
谢谢你的帮助。 在这一点上,我完全不知所措。
**更新**
所以我取得了一些进展…有点。 通过调用jwt.decode(id_token,certificate,true); 我能够成功解码令牌。 即使证书var是一个空对象{}。 这留下了三个问题。 1:使用谷歌的url将证书join我的快递应用的最佳方式是什么? 2:我怎么知道什么时候需要拉一个新的版本? 3:看起来像是通过noVerify(jwt.decode中的第3个参数)是一个可怕的想法。 我怎样才能在没有通过的情况下工作? 它看起来也许jwt-simple期待hs256和令牌使用rs256。
再一次,我在这方面超级经验不足,所以我可能会在这里的基础。
*更新*感谢来自纳特的帮助,我能够得到这个工作! 我想我已经尝试了每个JWT和JWS节点模块。 我最终得到的结果如下:我发现我看到的所有模块都不像我想要的那样。 我创build了以下用于解码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)来validation签名!
万岁! 再次感谢您在回复中提供的额外解释。 在帮助我了解我甚至想要做什么的过程中,这是很长的路要走。 希望这可以帮助别人。
从规范的angular度来看,你遇到的是[OpenID Connect]。
id_token是[JWS]签名的[JWT]。 在这种情况下,它是一个“。” 分成三个部分的string。 第一部分是标题。 其次是有效载荷。 三是签名。 它们中的每一个都是Base64url编码的string。
当你解docker,你会得到像这样的东西:
{ “ALG”: “RS256”, “孩子”: “43ebb53b0397e7aaf3087d6844e37d55c5fb1b67”}
“alg”表示签名algorithm为[JWA]中定义的RS256。 “kid”表示与用于签名的密钥对应的公钥的密钥ID。
现在我准备回答你的一些问题:
2:我怎么知道什么时候需要拉一个新的版本?
当caching的证书文件([JWK]文件)的孩子与头部中的孩子不匹配时,获取新的证书文件。 (顺便说一下,你从中取得证书的URL叫做x5u。)
3:看起来像是通过noVerify(jwt.decode中的第3个参数)是一个可怕的想法。 我怎样才能在没有通过的情况下工作?
确实。 也许你可能想看看另一个库,如kjur.github.io/jsjws/。
参考
- [OpenID Connect] openid.bitbucket.org/openid-connect-core-1_0.html
- [JWS] tools.ietf.org/html/draft-ietf-jose-json-web-signature
- [JWT] tools.ietf.org/html/draft-ietf-oauth-json-web-token
- [JWK] tools.ietf.org/html/draft-ietf-oauth-json-web-keys
- [JWA] tools.ietf.org/html/draft-ietf-jose-json-web-algorithms
- Expressjs(节点) – 如何获得一组根据用户过滤的数据
- 使用express / connect-redis抓取页面上的现有会话
- mongo / node TypeError:callback不是查询中的函数
- 维护和组织ExpressJS路由
- http.createServer(app)诉http.Server(app)
- Node + Express:Express是否为每个请求处理程序克隆req和res对象?
- 让我们等待几秒钟后再回来
- 使用Firebase身份validation和Express身份validation社交login?
- 为什么expressjs每个OPTIONS响应都发送Set-Cookie头?