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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: angular authentication jwt refresh-token jwt-auth


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

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