在节点服务器中生成刷新令牌和访问令牌

时间:2020-04-04 17:32:36

标签: node.js security authentication oauth-2.0 jwt

我正在构建移动设备和Web应用程序。这两个应用程序都将与节点服务器通信。我正在使用JWT进行身份验证。

当前,我有以下代码来生成访问令牌:

const token = jwt.sign({ user: body }, "top_secret");

我真的对刷新令牌和访问令牌感到困惑:

  1. 如何创建刷新令牌?
  2. 刷新令牌是什么样的?
  3. 我可以创建刷新令牌-类似于创建访问令牌的方式吗?
  4. 刷新令牌是否仅用于生成新的访问令牌?
  5. 刷新令牌可以用作访问令牌吗?
  6. 您如何使访问令牌无效
  7. 如何使刷新令牌无效?我见过的示例使用数据库存储刷新令牌。当您要使访问令牌无效时,将删除刷新令牌。如果将刷新令牌存储在用户模型上的数据库中以进行访问,对吗?在这种情况下,似乎应该对其进行加密

  8. 当用户登录我的应用程序时,我是否同时发送访问令牌和刷新令牌?我在某处(不记得在哪里)读到,发送访问令牌和刷新令牌不是一个好习惯。

  9. 如果不好的做法是同时发送访问令牌和刷新令牌,那么何时将刷新发送给客户端?客户端是否应该有一个端点请求访问令牌?
  10. 访问令牌和刷新脚趾的有效期限是多少

1 个答案:

答案 0 :(得分:0)

请注意,在典型的OAuth2方案中,服务器发行令牌(授权服务器)和使用访问令牌的API服务器(资源服务器)是不同的。另请参阅:Oauth2 roles

要回答您的问题:

  1. 您在服务器上生成了一个足够熵的字符串,并将其用作授权服务器中数据库记录的主键。参见refresh token syntax

  2. 来自https://tools.ietf.org/html/rfc6749#section-1.5

    刷新令牌是一个字符串,代表资源所有者授予客户端的授权。该字符串通常对客户端是不透明的。

  3. 您可以,但是刷新令牌通常不是结构化令牌(如JWT),因为它们由发布它们的同一服务器使用。

  4. 除非您使用introspection tokens,否则没有一种使它们失效的好方法。只是要缩短他们的一生。

  5. 从授权服务器存储中删除。如果在服务器上找不到刷新令牌,则不能将其用于刷新访问令牌。刷新令牌通常只是数据库记录的主键,该数据库记录包含有关客户端,用户和刷新令牌到期的数据。虽然您不想泄漏刷新令牌,但通常确实需要客户端使用它们来提供客户端凭据才能使用它。

  6. 用户在授权服务器上登录。它向客户端返回访问令牌和刷新令牌(如果您的客户端为confidential)。客户端仅使用访问令牌来访问资源服务器上的数据。

  7. 您的客户端在对授权服务器的调用中使用刷新令牌来获取新的访问令牌。因此,您的客户端仅将访问令牌发送到资源服务器,而仅将刷新令牌发送到授权服务器。

  8. 这取决于您的威胁模型。当您的刷新令牌过期时,将强制用户再次进行身份验证。有些产品使用永不过期的刷新令牌,另一些产品使用仅数小时或数天有效的刷新令牌。