如何在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)

过期后如何刷新 JWT 令牌(Angular 1.5 + Laravel 5.2)

如何使用 jwt 在 Angular 6 和 web api 中刷新令牌?

如何在 Spring Security 中刷新令牌