Authentication 如何在jwt身份验证中使用刷新令牌

Authentication 如何在jwt身份验证中使用刷新令牌,authentication,jwt,refresh-token,Authentication,Jwt,Refresh Token,我对实现刷新令牌有一些疑问。我找了很多,但什么也没找到: 刷新令牌必须使用jwt,还是可以是散列字符串?在刷新令牌中使用jwt有什么好处 刷新令牌是否应该有过期时间?我想为记住我功能使用刷新令牌,因此如果用户在一个月后返回网站或移动应用程序,他应该能够继续作为登录用户 我必须向客户端发送刷新令牌吗?(我们将其存储在数据库中,并在注销时将其删除) 我使用JWT令牌进行刷新。它作为访问令牌有不同的声明。此外,我还存储了一些refreshKey声明,这些声明也存储在数据库中。这种方法允许我撤销这个令牌

我对实现刷新令牌有一些疑问。我找了很多,但什么也没找到:

  • 刷新令牌必须使用
    jwt
    ,还是可以是散列字符串?在刷新令牌中使用
    jwt
    有什么好处

  • 刷新令牌是否应该有过期时间?我想为
    记住我
    功能使用刷新令牌,因此如果用户在一个月后返回网站或移动应用程序,他应该能够继续作为登录用户

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


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

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

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

  • 优点:您拥有与访问令牌相同的验证机制(有效性检查、过期日期等)
  • 通常刷新令牌的过期时间很长(比访问令牌长得多)。不建议使用长访问令牌,因为您无法撤销它们。只要您可以撤销它们,就可以使用持久刷新令牌
  • 是的,您必须将其发送给客户机,以保持体系结构无状态(我想这就是您使用JWT的目的)
  • 客户端将使用刷新令牌从服务器获取新的访问令牌。因此,刷新令牌的格式完全取决于发出令牌的授权服务器。如果您正在发布“访问令牌”和“刷新令牌”,则更容易使用相同的格式,即JWT格式
  • 刷新令牌必须具有到期时间。它可能比常规访问令牌到期时间长得多。它总是可以由资源进行配置
  • 您应该将刷新令牌发送给客户端,以便客户端可以使用它来请求新令牌
  • 客户端将使用刷新令牌从服务器获取新的访问令牌。因此,刷新令牌的格式完全取决于发出令牌的授权服务器。如果您正在发布“访问令牌”和“刷新令牌”,则更容易使用相同的格式,即JWT格式
  • 刷新令牌必须具有到期时间。它可能比常规访问令牌到期时间长得多。它总是可以由资源进行配置
  • 您应该将刷新令牌发送给客户端,以便客户端可以使用它来请求新令牌
    是,您必须将其发送到客户端,以保持体系结构无状态
    :刷新令牌必须保存在数据库中。所以我们可以处理注销功能。所以你的句子没有意义。由于我们必须在数据库中保存刷新令牌,我们不需要验证它们,所以我们不必在刷新令牌中使用
    jwt
    。我遗漏了什么吗?您只能从数据库中的刷新令牌保存一个声明,而不能保存整个令牌<代码>{iss:“iss值”,aud:“aud值”,exp:1553521788,refreshKey:“存储在db中的密钥”}我的问题就在这里,为什么我们不向用户发送
    refreshKey
    ?为什么我们需要验证它(作为jwt)?我们可以在db中保存
    refreshKey
    ,将其发送给用户,并在用户想要注销时从db中删除。对不起,我可能有点太狭隘了:)我使用的方法是,如果用户一个月不使用应用程序,他将注销。但如果你不想让他永远登录,你就不需要过期的刷新令牌。
    是的,你必须将其发送给客户端,以保持架构无状态。
    :刷新令牌必须保存在数据库中。所以我们可以处理注销功能。所以你的句子没有意义。由于我们必须在数据库中保存刷新令牌,我们不需要验证它们,所以我们不必在刷新令牌中使用
    jwt
    。我遗漏了什么吗?您只能从数据库中的刷新令牌保存一个声明,而不能保存整个令牌<代码>{iss:“iss值”,aud:“aud值”,exp:1553521788,refreshKey:“存储在db中的密钥”}我的问题就在这里,为什么我们不向用户发送
    refreshKey
    ?为什么我们需要验证它(作为jwt)?我们可以在db中保存
    refreshKey
    ,将其发送给用户,并在用户想要注销时从db中删除。对不起,我可能有点太狭隘了:)我使用的方法是,如果用户一个月不使用应用程序,他将注销。但如果你不想让他永远登录,你就不需要过期的刷新令牌。