当JWT中的令牌过期时如何刷新令牌。

3

我正在我的项目中实现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
  });
});

在这之后,我会验证结果中的令牌,并将其发送给客户端。一分钟后,我该如何重新生成令牌?请帮忙告诉我方法,并告诉我是否有做错的地方。谢谢!

我不会接受过期的令牌进行刷新。 - cassiomolin
如何正确实现这个功能? - user9065878
过期的令牌根据定义是无效的令牌。您可以使用刷新令牌,即长期有效的令牌,允许您刷新访问令牌或接受未过期的访问令牌进行刷新。 - cassiomolin
2个回答

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
    }
  }
});

1
@AnkushRanapure,一旦令牌过期,生成新的令牌始终是一个好习惯。 - Ankit Agarwal

1
您可以创建一个接受JWT令牌、验证它并为同一用户发放新令牌的API。
请查看jsonwebtoken的verify方法。在验证令牌时,您可以使用ignoreExpiration:true选项来验证过期的令牌。然后使用sign方法生成新令牌。
因此,在从前端发出请求时,如果收到令牌过期错误,则使用该API发放新令牌并保存该令牌。
话虽如此,我建议您查看有关从docs刷新JWT令牌的说明。
首先,我们建议仔细考虑自动刷新JWT是否会在您的系统中引入任何漏洞。我们不舒服将其作为库的一部分,但是您可以查看此示例以了解如何实现此操作。除了该示例外,还有一个问题和一个拉取请求可获取有关此主题的更多知识。这是包含代码的要点link

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接