如果生成了新的 JWT,如何使 JWT 过期

Posted

技术标签:

【中文标题】如果生成了新的 JWT,如何使 JWT 过期【英文标题】:How to expire JWT if a new one is generated 【发布时间】:2020-02-07 19:27:04 【问题描述】:

我是 JWT 实施的新手,但出现了一个问题。

我已经在 php 中使用 JWT 构建了一个用户登录认证。在用户登录时,如果用户的凭据有效,则登录 API 的响应是一个存储为 cookie 的令牌,而不是 $_SESSION 变量,我通过调用 API 来获取用户数据以进行解码令牌并在 Web 应用程序的每个页面上检索用户的数据。

如果用户想要更新他的个人详细信息(姓名、电子邮件等),我想根据新的详细信息生成一个新的 JWT,并强制之前的 JWT 过期或以某种方式使其无效。因此,在未来的 API 调用中,以前的令牌必须是无效的。 我想在数据库中存储令牌,但我想这是不对的。

我怎样才能让它工作?

【问题讨论】:

关注此参考链接medium.com/studioarmix/… 【参考方案1】:

无状态身份验证(在本例中为 JWT)将用户会话数据存储在客户端(浏览器)上。

数据由IdP的密钥签名,保证会话数据的完整性和权威性。 由于用户会话存储在客户端,服务器只能通过检查负载和签名是否匹配来验证其有效性。

其中一个缺点是您无法随时撤销会话:由于用户会话存储在客户端,因此服务器无权删除会话。

您可以做什么:

您可以删除客户端上存储的 JWT,并将其放入数据库黑名单中,并在每次有人调用 API 时进行检查

【讨论】:

【参考方案2】:

你不能不让 api 有状态。 因此,您可以在数据库中存储对 JWT 的引用并将其删除,或者您可以将已撤销的令牌列入黑名单并检查令牌是否被列入黑名单并因此被撤销。

【讨论】:

有没有办法避免建立数据库?比如以某种方式在旧 cookie 上设置一个过去的过期时间? 那么您只需假设客户端/用户将不再使用该令牌。所以删除cookie没有区别。如果你真的想避免这个特定的令牌可以再次使用,你必须以某种方式引入一个状态(例如数据库)。【参考方案3】:

你可以做两件事:

首先删除旧的 JWT 令牌并插入新的。

或者在数据库中创建一个字段(is_expired)来检查令牌的状态,默认应该是false,所以当你创建一个新的时,它标记为true,旧的必须用false值改变。

【讨论】:

以上是关于如果生成了新的 JWT,如何使 JWT 过期的主要内容,如果未能解决你的问题,请参考以下文章

JWT生成token及过期处理方案

如何使节点 js 中的 jwt 过期?

如何使 jwt-simple 中的令牌过期?

当用户在nodeJS / Express和Angular中空闲一段时间(基于令牌的授权)时,我如何使我的JWT令牌过期

如何手动使 JWT 令牌过期?

PHP JWT:: **解码** 过期令牌