如何生成刷新令牌?

问题描述 投票:0回答:2

我正在我的一个节点应用程序中实现 JWT。我想知道是否有任何明确的格式/结构应生成刷新令牌?

通过明确的格式,我的意思是刷新令牌是否包含任何像 JWT 这样的声明?

更新

我们假设刷新令牌为:

fdb8fdbecf1d03ce5e6125c067733c0d51de209c
(取自Auth0)。现在,我应该从中理解什么

  • 这是一个随机的唯一字符串吗?
  • 这是一个包含声明的加密字符串吗?
node.js express jwt refresh-token
2个回答
35
投票

简短回答

  • A
    refresh-token
    只是一个随机字符串。
  • 包括索赔在内的所有用户相关信息都在
    access-tokens

说明

你应该保留这样的东西:

{
  _id: [refreshTokenId],
  value: 'fdb8fdbecf1d03ce5e6125c067733c0d51de209c',
  userId: [userId],
  expires: [some date],
  createdByIp: [some ip],
  createdAt: [some date],
  replacedBy: [anotherRefreshTokenId],
  revokedByIp: [some other ip],
  revokedBy: [some other date],
}

刷新令牌是身份验证服务器生成的随机字符串。它们是在身份验证成功后生成的(例如,如果用户的用户名和密码有效)。

它们的唯一目的是消除重复交换用户凭据的需要。它们与访问令牌不同。

access-token
通常包含有关用户的信息(例如姓名、声明)。这些通常是短暂的。 JWT 就是一个例子。

要获取 JWT,应用程序必须验证凭据。
为了增加额外的安全性,并不再每隔 15 分钟打扰用户输入用户名和密码,我们只需创建

a signature on the server-side
并将其转发到应用程序。

下次,每当应用程序需要创建 JWT 时,它只需将签名发送回服务器即可。该签名是您的刷新令牌。

刷新令牌也应该保存在某个地方。
因此,您可能会在数据库中创建一个表/集合,将

refresh-token
值与
userIds
ip_address
链接起来。

这就是您为用户创建会话管理面板的方法。然后,用户可以查看我们已注册刷新令牌的所有设备(ip_addresses)。


0
投票

A

refresh-token
也可以通过与
access-token
相同的方式生成。只需确保在两者中都包含一个名为“token_type”的额外声明即可。

示例

{
    "token_type": "refresh",
    "iat": 1100313360,
    "exp": 1100814350,
    "context": {
        "user": {"name": "joe"},
        "type":["admin"]
    }
}

这种方法在更新时相对于随机字符串的优点

access-token

  • 不访问数据库获取上下文数据(如果没有黑名单)
  • 通过验证
    refresh-token
  • 注意到可疑请求
© www.soinside.com 2019 - 2024. All rights reserved.