如何在jwt中过期时刷新令牌
Posted
技术标签:
【中文标题】如何在jwt中过期时刷新令牌【英文标题】:how to refresh token when expired in jwt 【发布时间】:2019-02-11 18:31:38 【问题描述】:我正在我的项目中实现 JWT。我实现了 jwt 并给了它 1 分钟的过期时间。从 api 端生成的 jwt 是在登录期间,令牌和过期详细信息在结果中发送并存储在本地存储中。如何从 API 端刷新过期令牌并将其再次发送回客户端,以便可以将其存储在本地存储中并使用拦截器为每次调用发送?
这就是我创建 jwt 并给出过期时间的方式
// let us suppose this is my input
tokenObject = User: username: name, pwd: pwd ;
//creating a jwt here
jwt.sign( tokenObject , "secretkey", expiresIn: "60s" , (err, token) =>
res.json(
token
);
);
在此之后,我将验证结果中的令牌并将结果发送给客户端。 一分钟后如何重新生成令牌? 请帮助并让我知道方法并告诉我我是否做错了什么。谢谢!!
【问题讨论】:
我不会接受过期的令牌来提神。 实现这个的正确方法是什么? 过期令牌是每个定义的无效令牌。您可以使用刷新令牌,这是一种长期存在的令牌,允许您刷新访问令牌或接受未过期的访问令牌进行刷新。 【参考方案1】:您可以创建一个接受 JWT 令牌的 API,对其进行验证,然后为同一用户颁发一个新令牌。
看看jsonwebtoken
的verify方法。
在验证令牌时,您也可以使用ignoreExpiration: true
选项来验证过期的令牌。然后使用sign
方法生成新的。
因此,在从前端发出请求时,如果您收到令牌过期错误,那么您使用该 API 发出一个新令牌并保存该令牌。
话虽如此,我建议您查看有关从docs 刷新JWT
令牌的说明:
首先,如果自动刷新 JWT,我们建议仔细考虑 不会在您的系统中引入任何漏洞。
但是,我们不喜欢将它作为库的一部分包含在内, 你可以看看这个例子来展示这是怎么回事 完成。除了那个例子之外,还有一个问题和一个拉动 请求获得有关此主题的更多知识。
这是包含代码的要点的link。
【讨论】:
【参考方案2】:您需要添加一个函数或中间件来检查 JWT 是否有效。可以使用JWT
库的verify
方法:
jwt.verify(token, 'secretKey', function (err, decoded)
if (err)
if (err.name === 'TokenExpiredError')
//create a new token and send the same way you created initially
);
【讨论】:
@AnkushRanapure 在过期后生成新令牌始终是一个好习惯。以上是关于如何在jwt中过期时刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章
使用过期令牌发出同时 API 请求时如何避免多个令牌刷新请求
如何在 Alamofire Swift 中刷新 JWT 令牌状态代码 500
过期后如何刷新 JWT 令牌(Angular 1.5 + Laravel 5.2)