我在 JWT实施中完全陌生,出现了一个问题。
我已经在php中使用 JWT 建立了用户登录身份验证。在用户登录时,如果用户的凭据有效,则登录API的响应是作为令牌存储的 cookie 令牌,而不是具有$_SESSION
变量,而是通过调用API来获取用户数据在Web应用程序的每个页面上解码令牌并检索用户数据。
如果用户想更新其个人详细信息(姓名,电子邮件等),我想根据新的详细信息生成新的JWT ,并强制先前的过期或以某种方式使其无效。因此,在将来的API调用中,先前的令牌必须无效。 我曾想过将令牌存储在数据库中,但是我想这是不对的。
我如何使其起作用?
答案 0 :(得分:2)
您必须将api设为有状态。
因此,您可以将对JWT的引用存储在数据库中并删除它,也可以将已撤销的令牌列入黑名单,并检查该令牌是否已被列入黑名单并因此被撤销了。
答案 1 :(得分:2)
无状态身份验证(在本例中为JWT)将用户会话数据存储在客户端(浏览器)上。
数据由IdP密钥签名,以确保会话数据的完整性和权威性。 由于用户会话存储在客户端上,因此服务器只能通过检查有效负载和签名是否匹配来验证其有效性。
缺点之一是您无法随时取消会话:由于用户会话存储在客户端,因此服务器无权删除会话。
•您可以做什么:
您可以删除客户端上存储的JWT,并将其放入数据库黑名单中,并在每次有人调用API时进行检查
答案 2 :(得分:1)
您可以做两件事:
首先删除旧的JWT令牌,然后插入新的令牌。
或在数据库中创建一个字段(is_expired)以检查令牌的状态,默认值应为false,因此在创建新字段时,将其标记为true,而旧字段必须更改为false。