试图了解jwt身份验证流程

时间:2019-03-30 11:08:07

标签: javascript node.js jwt flow

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

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

我的问题是:

  1. 用户如何确定访问令牌已过期? 客户端应用可能会数分钟? 还是客户端尝试使用访问令牌,然后获得“令牌已过期”响应?

  2. 步骤6中的所有条件是否足够? 如果有人从客户端获取刷新令牌怎么办,我该如何防范呢? 还应该检查条件3吗?

  3. 服务器如何验证刷新令牌?

谢谢!

2 个答案:

答案 0 :(得分:2)

JSON Web令牌由3部分组成,即标头,有效负载和签名。标头和有效载荷不是加密的而是编码的(base64),这意味着客户端可以简单地解码这些部分。

所以要回答您的第一个问题->客户端只需解码有效载荷部分并从registered claims中读取exp-property。如果您使用的是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)

  1. 否,这不是检查令牌到期的客户端,这是服务器端操作。当然,不是,不是由客户端应用程序来检查到期时间并计算分钟数的。是的,客户端发送令牌并获得可能的“令牌已过期”响应。

  2. 像这样简单,如果令牌有效,那么您就可以进行了。如果没有(过期,无论如何),您就不是。到期日期在令牌有效载荷本身中。并且应该对服务器和客户端之间的传输进行加密。

  3. 服务器验证刷新令牌的方式与验证任何令牌的方式相同。通常在用户数据库的登录名/密码上进行验证以检查授权。这只是更新jwt令牌的工具。

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

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