【问题标题】:How to use refresh tokens in jwt authentication如何在 jwt 身份验证中使用刷新令牌
【发布时间】:2019-08-30 18:48:57
【问题描述】:

我对实现刷新令牌有一些疑问。我搜索了很多但一无所获:

  1. 我必须使用jwt 来表示刷新令牌还是可以是散列字符串?在刷新令牌中使用jwt 有什么好处?

  2. 刷新令牌应该有一个过期时间吗?我想将刷新令牌用于remember me 功能,因此如果用户在一个月后返回网站或移动应用程序,他应该能够以登录用户身份继续。

  3. 我必须向客户端发送刷新令牌吗? (因为我们将其存储在数据库中并在注销时将其删除)

【问题讨论】:

    标签: authentication jwt refresh-token


    【解决方案1】:
    1. 客户端将使用刷新令牌从服务器获取新的访问令牌。因此,刷新令牌的格式完全取决于颁发令牌的授权服务器。如果您要发行“访问令牌”和“刷新令牌”,那么使用相同的格式(即 JWT 格式)会更容易。
    2. 刷新令牌必须有到期时间。它可能比常规访问令牌到期时间长得多。它始终可以由资源配置。
    3. 您应该将刷新令牌发送给客户端,以便客户端可以使用它来请求新令牌。

    【讨论】:

      【解决方案2】:

      我正在使用 JWT 令牌进行刷新。它有不同的声明作为访问令牌。此外,我存储了一些refreshKey 声明,这些声明也存储在数据库中。这种方法允许我撤销这个令牌以防万一(例如用户阻塞功能)。

      1. 优点:您拥有与访问令牌相同的验证机制(有效性检查、到期日期等)。
      2. 通常刷新令牌的过期时间很长(比访问令牌长得多)。不建议使用长访问令牌,因为您无法撤销它们。只要您可以撤销它们,就可以拥有持久的刷新令牌。
      3. 是的,您必须将其发送给客户端,以使您的架构保持无状态(我想这是您使用 JWT 的目的)

      【讨论】:

      • Yes you have to send it to client, to keep you architecture stateless :刷新令牌必须保存在数据库中。所以我们可以处理注销功能。所以你的句子没有意义。
      • 由于我们必须在数据库中保存刷新令牌,我们不需要验证它们,所以我们不必在刷新令牌中使用jwt。我错过了什么吗?
      • 您只能从数据库中的刷新令牌中保存一个声明,而不是整个令牌。 { iss: "iss value", aud: "aud value", exp: 1553521788, refreshKey: "key stored in db" }
      • 我的问题正是在这里,为什么我们不只是将refreshKey 发送给用户?为什么我们需要验证它(作为 jwt)?我们可以将refreshKey保存在db中,发送给用户,当用户想退出时从db中删除。
      • 对不起,我可能有点太装箱了:) 我使用了这种方法,如果用户一个月不使用应用程序,他就会被注销。但如果你不想让他永远登录,你就不需要过期的刷新令牌。
      猜你喜欢
      • 1970-01-01
      • 2020-07-07
      • 2019-02-27
      • 2017-12-29
      • 2021-09-17
      • 2017-11-08
      • 2015-06-24
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多