试图了解jwt身份验证流程

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

所以我试图了解jwt身份验证的流程,我有一些漏洞,这就是我得到的:

  1. 用户登录
  2. 用户获取jwt访问令牌并刷新令牌(服务器不保留任何令牌)
  3. 访问令牌持续5分钟,刷新令牌7天
  4. 访问令牌到期
  5. 用户向服务器发送刷新令牌
  6. 服务器检查: 如果访问令牌(过期的)用户id ==刷新令牌的用户ID 验证刷新令牌是否已过期 也许验证访问令牌已过期(不确定)
  7. 如果所有这些条件都已启用,则服务器会向客户端发送新的访问令牌
  8. 用户照常进行
  9. 刷新令牌到期
  10. 刷新令牌需要验证才能发送新的令牌

我的问题是:

  1. 用户如何发现访问令牌已过期?也许客户端应用计算分钟?或者客户端尝试使用访问令牌然后获得“令牌过期”响应?
  2. 第6步中的所有条件都足够了吗?如果有人从客户端获取刷新令牌,我该怎样保护呢?还应该检查条件3吗?
  3. 服务器如何验证刷新令牌?

谢谢!

javascript node.js jwt flow
2个回答
2
投票

JSON Web令牌由3部分组成,即Header,Payload和Signature。 Header和Payload没有加密而只是编码(base64),这意味着客户端可以简单地解码这些部分。

所以回答你的第一个问题 - >客户端只需解码有效负载部分并从registered claims读取exp属性。如果您使用的是node-jsonwebtoken库,那么它将类似于:

// get the decoded payload and header
var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.payload)

为了使服务器验证令牌,您必须提供用于签署JWT的密钥对中的密钥或公钥。使用node-jsonwebtoken,这将工作如下:

// verify a token asymmetric
const cert = fs.readFileSync('public.pem');  // get public key
jwt.verify(token, cert, function(err, decoded) {
  console.log(decoded.foo) // bar
});

OR

// verify a token symmetric using secret
const decoded = jwt.verify(token, 'mySecret');

1
投票
  1. 不,这不是检查令牌过期的客户端,这是服务器端操作。当然,不,这不是客户端应用程序检查过期,计算分钟数。是客户端发送令牌并获得可能的“令牌过期”响应。
  2. 就像那样简单,如果令牌有效,你就可以去了。如果不是(过期,观察)你不是。到期日期在令牌有效负载本身中。而且你应该加密服务器和客户端之间的传输。
  3. 服务器验证刷新令牌的方式与验证任何令牌的方式相同。通常在用户数据库上登录/密码验证以检查授权。这只是更新jwt令牌的工具。

总而言之,jwt身份验证流程比以下更简单:

  1. 客户端发送带有身份验证的请求
  2. 服务器使用认证令牌进行响应
  3. 客户端使用该令牌与应用程序对话
  4. 如果jwt令牌过期,客户端会发送刷新令牌以进行续订(可选)
© www.soinside.com 2019 - 2024. All rights reserved.