Javascript 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使用当前时间作为输入。但这又提出了另一个问题,服务器如何验证令

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);