OpenIdConnect 从 OpenId Provider 验证 jwt
OpenIdConnect verify jwt from OpenId Provider
我们有一个 Web 应用程序 Vuejs(正面)和一个 api Nodejs(背面)。
我们将身份验证委托给第三方 OpenIdProvider。
用户在前面登录并获取和访问令牌。
此访问令牌包含:
- nbf :不得接受 JWT 进行处理的时间。
- iat:发布JWT的时间
- exp: token 到期时间
以我为例,当我在上午 11 点登录时,我有:
- nbf: 11:00 上午
- 我在:11:00上午
- exp: 11:30 am
在VueJS对NodeAPI的每次请求中,access token都是由后台传递和验证的。
我这样验证 jwt 令牌:
jwt.verify(token, publicKey, { algorithms: ['RS256'], audience: process.env.OP_CLIENT });
公钥是从 OpenIdProvider jwks_uri 读取的,受众是我的提供商客户端 ID。
问题是我的nodejs服务器上的时间晚了,是吗:9:00
因此,当我使用验证时,我收到此错误消息:
NotBeforeError: jwt not active
at /var/www/app/node_modules/jsonwebtoken/verify.js:143:21
at getSecret (/var/www/app/node_modules/jsonwebtoken/verify.js:90:14)
at Object.module.exports [as verify] (/var/www/app/node_modules/jsonwebtoken/verify.js:94:10)
at async authUser (/var/www/app/src/helpers/openid.js:87:19) { date: 2021-07-27T09:00:51.000Z }
我读到我可以忽略 notBefore 选项,但问题仍然存在于令牌的有效期上?
因为提供商的发布时间和我的服务器上的时间之间存在时间差,它会扭曲验证。
你有什么建议?这是从提供商处验证我的令牌的正确方法吗?
您的代码看起来很标准 - 类似于 this code of mine。
使用的时间应为 UTC 时间,因此首选解决方案是确保服务器上的 UTC 时间正确 - 例如通过 运行 一个简单的 OS 命令,例如 date -u
在 bash.
另请注意,有一个名为 clockTimestamp 的选项可以传递到 Auth0 库中。
如果服务器时钟严重错误,这将无济于事。如果 IT 管理员运行服务器,他们的工作就是确保系统时钟正确。
我们的服务器 运行 在 swarm 集群的 docker 容器内。
所以我想,我必须在我的部署阶段正确设置好的 UTC 时区
谢谢加里!
最后我设置
ENV TZ="Europe/Paris" 在我的 docker 文件中,我的后端现在处于正确的时区。
我还添加了 notBefore 检查的停用,以避免出现几分钟延迟时出现的问题
jwt.verify(token, publicKey, { ignoreNotBefore:true, algorithms: ['RS256'], audience: process.env.OP_CLIENT });
我们有一个 Web 应用程序 Vuejs(正面)和一个 api Nodejs(背面)。
我们将身份验证委托给第三方 OpenIdProvider。
用户在前面登录并获取和访问令牌。
此访问令牌包含:
- nbf :不得接受 JWT 进行处理的时间。
- iat:发布JWT的时间
- exp: token 到期时间
以我为例,当我在上午 11 点登录时,我有:
- nbf: 11:00 上午
- 我在:11:00上午
- exp: 11:30 am
在VueJS对NodeAPI的每次请求中,access token都是由后台传递和验证的。
我这样验证 jwt 令牌:
jwt.verify(token, publicKey, { algorithms: ['RS256'], audience: process.env.OP_CLIENT });
公钥是从 OpenIdProvider jwks_uri 读取的,受众是我的提供商客户端 ID。
问题是我的nodejs服务器上的时间晚了,是吗:9:00
因此,当我使用验证时,我收到此错误消息:
NotBeforeError: jwt not active at /var/www/app/node_modules/jsonwebtoken/verify.js:143:21 at getSecret (/var/www/app/node_modules/jsonwebtoken/verify.js:90:14) at Object.module.exports [as verify] (/var/www/app/node_modules/jsonwebtoken/verify.js:94:10) at async authUser (/var/www/app/src/helpers/openid.js:87:19) { date: 2021-07-27T09:00:51.000Z }
我读到我可以忽略 notBefore 选项,但问题仍然存在于令牌的有效期上? 因为提供商的发布时间和我的服务器上的时间之间存在时间差,它会扭曲验证。
你有什么建议?这是从提供商处验证我的令牌的正确方法吗?
您的代码看起来很标准 - 类似于 this code of mine。
使用的时间应为 UTC 时间,因此首选解决方案是确保服务器上的 UTC 时间正确 - 例如通过 运行 一个简单的 OS 命令,例如 date -u
在 bash.
另请注意,有一个名为 clockTimestamp 的选项可以传递到 Auth0 库中。
如果服务器时钟严重错误,这将无济于事。如果 IT 管理员运行服务器,他们的工作就是确保系统时钟正确。
我们的服务器 运行 在 swarm 集群的 docker 容器内。
所以我想,我必须在我的部署阶段正确设置好的 UTC 时区
谢谢加里! 最后我设置 ENV TZ="Europe/Paris" 在我的 docker 文件中,我的后端现在处于正确的时区。
我还添加了 notBefore 检查的停用,以避免出现几分钟延迟时出现的问题
jwt.verify(token, publicKey, { ignoreNotBefore:true, algorithms: ['RS256'], audience: process.env.OP_CLIENT });