【问题标题】:What is the difference between a JWT token and a Refresh token?JWT 令牌和刷新令牌有什么区别?
【发布时间】:2019-03-25 11:11:33
【问题描述】:

我正在努力了解refresh tokens 以及它们如何与JWT 一起使用,因此我可以在没有auth0 API 服务的情况下使用它。

  • 为什么刷新令牌格式与 JWT 不同?
  • 刷新令牌只是存储在数据库中的简单令牌?
  • 使用刷新令牌获取 JWT 令牌的流程如何?

谢谢!

更新

正如@Florent Morselli 建议的那样。这篇文章的基本问题是错误的和令人困惑的。因为 JWT 和刷新令牌并不是真正可以相关的概念。一个更好的问题可能是:

  • JWT 令牌和不透明令牌有什么区别?
  • 访问令牌和刷新令牌有什么区别?

我不会更改标题中的问题,因为有人可能会错误地寻找相同的东西,这会导致他们看到这篇文章。

【问题讨论】:

  • 你在使用代码流吗?
  • 你的问题不是很清楚,因为它混合了几个概念。 JWT 只是数字签名和/或加密令牌的标准格式。刷新令牌可以是随机字符串,也可以是 JWT。您的问题可能是“JWT 令牌和不透明令牌有什么区别”或“访问令牌和刷新令牌有什么区别”
  • @FlorentMorselli 我知道了。一开始我很困惑,现在我看到了区别。但是,我不确定我是否要更改标题,因为其他人可能有同样的“错误”问题,这可能会导致他们进入此条目。我会用你的 cmets 更新描述。
  • 好的,明白了。我为你的问题写了一个可能的答案。希望它足够清楚。

标签: jwt


【解决方案1】:

令牌可以有两种类型:

  • 参考标记
  • 按价值划分的代币

对于第一种类型,标记是不透明的字符串(通常是随机字符串),它引用存储与标记关联的值的数据库索引。

对于第二种类型,标记包含值。为了避免更改,它们被数字签名或散列。由于它们还可能包含敏感数据,因此可以对其进行加密。

JSON Web Token 是一套规范(主要是 RFC7515RFC7520),它为第二种类型引入了一种新格式。

为什么 oauth0 发出的刷新令牌是第一类而不是 JWT(第二类)?

按价值计算的代币的主要好处是它们可以是无状态的,即您不需要任何类型的数据库。 这在将令牌多次发送到服务器时非常有用,因为它们大大减少了数据库调用,从而缩短了响应时间。

缺点是您无法撤销它们。或者如果你添加了一个撤销系统,那么你必须管理和调用一个数据库。 因此,按值标记的令牌应该具有非常有限的生命周期,这与刷新令牌不兼容。

【讨论】:

  • 在第一行中,当您输入With the first type, the tokens are opaque strings 时,您正在谈论Tokens by Reference,它似乎与The main benefit of the tokens by reference is that they can be stateless 不匹配。这可能吗?
【解决方案2】:

根据 OpenID 规范,在 代码流混合流 中使用刷新令牌参见下图

参考:https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowSteps

为什么刷新令牌格式与 JWT 不同?

刷新令牌的格式也符合 OpenID 的规范

参考:https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowSteps

刷新令牌只是存储在数据库中的简单令牌?

刷新令牌将从您的 IDP(身份提供者动态)生成。

使用刷新令牌获取 JWT 令牌的流程如何?

一旦您拥有如上一步所示的刷新令牌,您就可以使用刷新令牌向令牌端点发出请求以获取访问令牌

访问令牌

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 2018-09-29
    • 1970-01-01
    • 2021-08-23
    • 2016-03-05
    • 2016-06-25
    • 2020-10-15
    • 2021-12-02
    相关资源
    最近更新 更多