OpenIdConnect 从 OpenId 提供者验证 jwt

Posted

技术标签:

【中文标题】OpenIdConnect 从 OpenId 提供者验证 jwt【英文标题】:OpenIdConnect verify jwt from OpenId Provider 【发布时间】:2021-10-03 03:40:12 【问题描述】:

我们有一个 web 应用程序 Vuejs(front) 和一个 api Nodejs(back)。

我们将身份验证委托给第三方 OpenIdProvider。

用户在前台登录并获取和访问token。

此访问令牌包含:

nbf :JWT 不得被接受处理之前的时间。 iat:发布 JWT 的时间。 exp:令牌过期时间

就我而言,当我在上午 11 点登录时,我有:

nbf:上午 11:00 上午 11:00 exp:上午 11:30

在VueJS对NodeAPI的每一次请求中,背后都会传递访问令牌并进行验证。

我像这样验证 jwt 令牌:

jwt.verify(token, publicKey,  algorithms: ['RS256'], audience: process.env.OP_CLIENT );

publicKey 是从 OpenIdProvider jwks_uri 中读取的,受众是我的提供者客户端 ID。

问题是我的nodejs服务器时间晚了,是不是:9:00

所以当我使用验证时,我会收到以下错误消息:

NotBeforeError:jwt 未激活 在 /var/www/app/node_modules/jsonwebtoken/verify.js:143:21 在 getSecret (/var/www/app/node_modules/jsonwebtoken/verify.js:90:14) 在 Object.module.exports [作为验证] (/var/www/app/node_modules/jsonwebtoken/verify.js:94:10) 在异步 authUser (/var/www/app/src/helpers/openid.js:87:19) 日期:2021-07-27T09:00:51.000Z

我读到我可以忽略 notBefore 选项,但在令牌的有效期内问题仍然存在? 因为提供者的发布时间和我的服务器上的时间之间存在时间差,它会扭曲验证。

你有什么推荐的?这是从提供商验证我的令牌的正确方法吗?

【问题讨论】:

【参考方案1】:

您的代码看起来很标准 - 类似于 this code of mine。

使用的时间应该是 UTC 时间,因此首选的解决方法是确保服务器上的 UTC 时间正确 - 例如通过在 bash 中运行简单的操作系统命令,例如 date -u

另请注意,有一个名为 clockTimestamp 的选项可以传递到 Auth0 库中。

如果服务器时钟严重错误,这将无济于事。如果 IT 管理员运行服务器,他们的工作就是确保系统时钟正确。

【讨论】:

【参考方案2】:

谢谢加里! 最后我设置 ENV TZ="Europe/Paris" 在我的 docker 文件中,我的后端现在处于合适的时区。

我还添加了 notBefore 检查的停用,以避免在延迟几分钟时出现问题

jwt.verify(token, publicKey,  ignoreNotBefore:true, algorithms: ['RS256'], audience: process.env.OP_CLIENT );

【讨论】:

【参考方案3】:

我们的服务器在 swarm 集群的 docker 容器中运行。

所以我认为,我必须在部署阶段正确设置良好的 UTC 时区

【讨论】:

以上是关于OpenIdConnect 从 OpenId 提供者验证 jwt的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API 和 OpenID Connect:如何从授权码中获取访问令牌

OpenID Connect 提供商 [关闭]

Python 中的 OpenID Connect 提供程序

OpenID Connect webfinger 端点是用户帐户到 OpenID Connect 提供者的映射吗?

什么 OpenID Connect 授权流程来验证移动应用程序用户?

OpenID Connect:不同身份提供者之间的刷新令牌行为不一致