带有刷新令牌工作流问题的 Java Spring JWT

D.T*_*mov 10 java spring oauth spring-security jwt

我有一些关于使用 Java Spring 的 API JWT 刷新令牌工作流的问题。

到目前为止我有这个:

  1. 用户登录到 /users/login - 如果成功,则返回带有 2 个标头的响应授权和刷新。其中包含 2 个令牌 - 一个具有 30 分钟的短到期时间,一个具有较长的 4 小时到期时间。
  2. 然后他可以使用 Authorization 标头访问所有其他端点。
  3. 如果在某个时刻访问端点,他的令牌已过期,他会收到一个错误(未经授权)。
  4. 并且必须使用他获得的刷新令牌向 /token/refresh 发出请求。

问题:

  • 我已经设置好授权令牌有一个声明:type=auth,刷新令牌有一个声明:type=refresh。区分这两个令牌的最佳方法是什么。
  • 步骤 3 中的错误(而不是未授权)应该是什么,以将其与没有有效令牌的请求区分开来
  • /token/refresh 当前不要求进行身份验证。应该是?
  • /token/refresh 端点是否应该是带有标题的 POST、带有参数的 POST 或带有标题的 GET。

ygo*_*gor 16

区分这两个令牌的最佳方法是什么。

刷新令牌根本不必是 JWT。我更喜欢简单地生成一个随机的字母数字字符串。刷新令牌不携带任何附加信息。它需要查找数据库以确认刷新令牌的有效性。您可以通过它们出现在您的请求中的位置来区分它们。授权令牌(访问令牌)应出现在您选择的标题中。

步骤 3 中的错误(而不是未授权)应该是什么,以将其与没有有效令牌的请求区分开来

发送 401 Unauthorized 正是这样做的方法。401 告诉客户端,他现在无法访问资源,但他可以采取措施再次访问资源(登录/刷新令牌)。另一端的 403 会告诉客户端,该资源不属于他,他将不得不请求权限,例如通过联系管理员

/token/refresh 当前不要求进行身份验证。应该是?

不,不需要身份验证。

/token/refresh 端点是否应该是带有标题的 POST、带有参数的 POST 或带有标题的 GET。

通常 GET 端点应该是只读的,而不是改变任何资源。POST 和 PUT 端点用于突变。在这种情况下,我将使用带有参数和专用 URL 的 POST,例如 /token/refresh

  • 您可以在 https://github.com/ygor-sk/stackoverflow/tree/master/q53220918-jwt-refresh-token-workflow 查看完整示例 (3认同)