Angular 8:如何在没有刷新令牌的情况下刷新令牌

Posted

技术标签:

【中文标题】Angular 8:如何在没有刷新令牌的情况下刷新令牌【英文标题】:Angular 8: How to refresh a token without a refresh token 【发布时间】:2020-02-27 04:35:02 【问题描述】:

当不使用刷新令牌、OAuth 等时,刷新令牌的首选方式是什么?

我只是在用户对我的 API 进行身份验证时创建一个 JWT,该 API 有效期为几分钟。

然后在拦截器中使用令牌来访问我的 API 的安全路由。

我想在旧令牌过期前几分钟刷新令牌,而不将用户重定向到登录屏幕。

从技术上讲,这不是问题(也没有刷新令牌)。

但是一直刷新它是否安全?我想我已经知道答案了……是的。

我知道使用刷新令牌是首选方式。

但是还有其他方法吗?你是如何实现这样的行为的?

【问题讨论】:

【参考方案1】:

一种方法是使用现有令牌作为刷新令牌。

在您的interceptor,或者您检查用户是否已通过身份验证的任何地方,您还可以检查令牌是否即将到期。

您可以对令牌进行解码以查找其到期日期和时间。您可以选择在到期前 X 天或您想要的任何时候续订。

请记住,您可以在不知道密钥的情况下解码 JWT 令牌。 解密令牌需要密钥,但解码不需要。您可以使用 jwt-decode 之类的库来解码令牌或 write a function to do it by yourself。

在后端,您应该有一个接受当前 JWT 令牌的 API 端点,如果有效,则创建并返回具有相同内容的新令牌。

但是一直刷新它是否安全?

如您所知,一直刷新它是不安全的。这是因为如果恶意实体有权访问令牌,他们可以更新它以获得具有延长到期时间的新令牌。这个新令牌可用于在到期前再次更新。这可能会无限期地持续下去,直到我们识别出这些令牌并停止它们的更新。

您可以采取一些步骤使其更加安全:

在后端跟踪每个用户的续订计数,并在达到阈值后停止续订。 停止更新在 X 周或特定时间之前发行的代币。

这样在一些续订或一段时间后,用户必须再次进行身份验证并获得一个新的令牌。

【讨论】:

感谢您的回答。这正是我目前正在做的事情。我只是想是否有更好的方法来刷新令牌。也许不是自动刷新它,而是向用户显示令牌即将到期的弹出窗口,并提供扩展它的选项。当它不会自动发生时,它会提供更多的安全性吗? 不客气@chris1302。是的,这是让用户决定延长会话的另一种选择。它本质上不会提供更多安全性,但用户可能会决定注销并再次登录,这样会更好。但大多数情况下,人们只会扩展它,当经常重复时,它会让用户感到厌烦。这是安全性和用户体验之间的权衡。我也有兴趣了解其他选择。让我们等待其他答案。 我觉得一直自动刷新token的效果就像把token设置为“永不过期”一样。但我和你在一起。我也想听听其他一些选择。 不,我不这么认为。因为你只能刷新它,只要它是有效的。因此,如果恶意行为者掌握了它,他只能在它有效之前使用它。如果仍然无效,他甚至不能刷新它。 @Sobvan - 用户只能在它有效之前刷新它是正确的。但是在续订之后,会发出一个具有延长到期时间的新令牌,可以在到期前再次使用它来续订。这可能会无限期地持续下去。正如我所提到的,我们可以通过检查发布日期/时间或基于其他标准来停止更新它们。我编辑了我的答案以使其更清楚。

以上是关于Angular 8:如何在没有刷新令牌的情况下刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular 和 JWT 令牌持续登录

在没有刷新令牌的情况下获取 AdWords customerId

是否可以在没有刷新令牌的情况下检查 JWT 有效性?

使用带有 JWT Auth/Laravel 的 Angular JS 获取新的刷新令牌后,如何恢复/重新发送请求?

在 Angular 5 中,静默刷新不适用于 OIDC 客户端

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