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

带刷新令牌工作流问题的Java Spring JWT,java,spring,spring-security,oauth,jwt,Java,Spring,Spring Security,Oauth,Jwt,关于使用JavaSpring的API JWT刷新令牌工作流,我有一些问题 到目前为止,我已经做到了: 用户登录到/users/login-如果成功,将返回带有2个标题的响应授权和刷新。其中包含2个令牌-一个短30分钟到期,另一个长4小时到期 然后,他可以使用授权标头访问所有其他端点 如果在某个点访问端点时,他的令牌过期,他将收到一个错误(未经授权) 并且必须使用提供给他的刷新令牌请求/token/refresh 问题: 我已经对其进行了设置,以便授权令牌具有声明:type=auth和 刷新令牌

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

到目前为止,我已经做到了:

  • 用户登录到/users/login-如果成功,将返回带有2个标题的响应授权和刷新。其中包含2个令牌-一个短30分钟到期,另一个长4小时到期
  • 然后,他可以使用授权标头访问所有其他端点
  • 如果在某个点访问端点时,他的令牌过期,他将收到一个错误(未经授权)
  • 并且必须使用提供给他的刷新令牌请求/token/refresh
  • 问题:

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

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

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

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

    /令牌/刷新当前不要求身份验证。应该吗

    不,不需要身份验证

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


    一般来说,GET端点应该是只读的,并且不改变任何资源。POST和PUT端点用于突变。在本文中,我将使用带有参数的帖子和专用URL,例如/token/refresh

    非常感谢。如果我不想在数据库中存储刷新令牌,有没有办法呢?是的,当然可以将刷新令牌表示为JWT。但有一个陷阱。JWT的有效期是“用石头写的”。它将在4小时后失效。然而,当您希望刷新令牌很快过期时,有很多场景。示例一:显式注销->用户按下“注销”按钮。示例二:您希望立即禁止该帐户,并且不允许用户再使用刷新令牌。示例三:刷新请求看起来可疑->它来自不同的用户代理、不同的国家/地区…您可以在Thank You very查看完整示例much@ygor很好的回答,感谢您的示例,但是在示例中,将jwt令牌传递给需要令牌的任何端点都会返回401,原因可能是什么。