Javascript jwt是否使用当前时间作为输入,以便在每次请求时提供不同的令牌
jwt对于相同的输入,结果不同Javascript jwt是否使用当前时间作为输入,以便在每次请求时提供不同的令牌,javascript,jwt,Javascript,Jwt,jwt对于相同的输入,结果不同 const createToken = async (user, secret, expiresIn) => { const { id, email, username } = user; return await jwt.sign({ id, email, username }, secret, { expiresIn }); }; 所以我假设jwt使用当前时间作为输入。但这又提出了另一个问题,服务器如何验证令
const createToken = async (user, secret, expiresIn) => {
const { id, email, username } = user;
return await jwt.sign({ id, email, username }, secret, {
expiresIn
});
};
所以我假设jwt使用当前时间作为输入。但这又提出了另一个问题,服务器如何验证令牌?如果当前时间在令牌中,服务器将永远不会验证令牌是否有效,因为时间不同 它不使用
当前时间+到期时间in
作为到期时间。
如果您解码jwt令牌,您将看到有两个字段iat
和exp
,其中iat
是创建令牌的时间
const user = {
id: '1',
email: 'henok@gmail.com',
username: 'henoktes72'
}
createToken(user, secret, '30m')
此代码等同于
jwt.sign({ id, email, username }, secret, {
expiresIn: '30m'
});
您对JWT的总体工作原理有一些疑问,因此我将简要介绍它们的工作原理。您的JWT内部包含多条称为索赔的信息。它们通常包括以下内容:
- 用户名
- 呼气时间
- 水平仪
expiryTime
(标准名称exp
)存储JWT到期的时间戳。服务器将要做的第一件事是验证传入的JWT是否已打开,并检查到期时间是否已过。如果已通过,则服务器将立即拒绝令牌。因此,到期时间被用作把关人,以防止应用程序中的过期令牌
除此之外,通常还有另一个验证步骤,服务器必须点击缓存或数据库之类的东西来检查JWT是否仍然有效。对于此检查,将使用
用户名
或与用户对应的其他唯一标识符作为查找键
我还包括了一个我称之为
级别
的索赔。假设您的应用程序可能具有不同级别的身份验证,则该级别可能存储与此对应的状态。谢谢,但我了解到服务器会动态验证令牌,而不是与存储的令牌进行比较。存储的令牌?我在哪里提到过关于存储令牌的内容?除此之外,通常还有另一个验证步骤,服务器必须点击缓存或数据库来检查JWT是否仍然有效。对于此检查,用户名或与用户对应的其他唯一标识符将用作查找的密钥。是的,但我从未说过存储令牌。只会在缓存或数据库中创建一个非常小的条目。是的,一般来说,您需要这样做,因为JWT不是完全无状态的。除非您永远不需要限制令牌,这可能不是您的情况。是的,因此服务器无法动态验证令牌。谢谢@PrithweeDas。您没有提到服务器如何验证令牌。
jwt.sign({ id, email, username, exp: Date.now()+30*60*1000 }, secret);