所以我试图了解jwt身份验证的流程,并且我有一些漏洞,这就是我得到的:
我的问题是:
用户如何确定访问令牌已过期? 客户端应用可能会数分钟? 还是客户端尝试使用访问令牌,然后获得“令牌已过期”响应?
步骤6中的所有条件是否足够? 如果有人从客户端获取刷新令牌怎么办,我该如何防范呢? 还应该检查条件3吗?
服务器如何验证刷新令牌?
谢谢!
答案 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)
否,这不是检查令牌到期的客户端,这是服务器端操作。当然,不是,不是由客户端应用程序来检查到期时间并计算分钟数的。是的,客户端发送令牌并获得可能的“令牌已过期”响应。
像这样简单,如果令牌有效,那么您就可以进行了。如果没有(过期,无论如何),您就不是。到期日期在令牌有效载荷本身中。并且应该对服务器和客户端之间的传输进行加密。
服务器验证刷新令牌的方式与验证任何令牌的方式相同。通常在用户数据库的登录名/密码上进行验证以检查授权。这只是更新jwt令牌的工具。
总而言之,jwt身份验证流程比这更简单: