【问题标题】:Why does my JWT expiresIn value change between sending it from the server and receiving it on the front-end?为什么我的 JWT expiresIn 值在从服务器发送到前端接收之间会发生变化?
【发布时间】:2021-07-11 01:23:31
【问题描述】:

我在服务器上设置了我的令牌到期日期,并在console.log 中设置了要检查的值:

但是,当我检查我的 React 前端的值时,我得到了这个值:

我不会以任何方式更改到期日期,但值在发送和接收之间发生了巨大变化。

有人有什么想法吗?

服务器代码

const d = new Date();
        console.log(
          'current date: ',
          moment(d.getTime()).format('YYYY-MM-DD HH:mm:ss')
        );
        /*const calculatedExpiresIn =
          d.getTime() +
          60 * 60 * 1000 -
          (d.getTime() - d.getMilliseconds()) / 1000;*/
        const calculatedExpiresIn = d.getTime() + 60 * 60 * 1000;
        console.log(
          'calculatedExpiresIn: ',
          moment(calculatedExpiresIn).format('YYYY-MM-DD HH:mm:ss')
        );
        console.log('calculatedExpiresIn: ', calculatedExpiresIn);

        const iat = d.getTime();
        const user = ok([
          {
            id: res[0].id,
            token: jwt.sign(
              {
                id: res[0].id,
                email: res[0].email,
                firstName: res[0].firstName,
                surname: res[0].surname,
                role: res[0].role,
                iat: iat,
              },
              config.secret,
              {
                expiresIn: calculatedExpiresIn,
              }
            ),
          },
        ]);

前端代码

validateSession() {
    let token = sessionStorage.getItem('unikey');
    const d = new Date();

    if (token && token !== undefined) {
      let decodedToken = jwtDecode(token);
      /*console.log('decodedToken: ', decodedToken);
      console.log(
        'decodedToken iat date: ',
        moment(decodedToken.iat).format('YYYY-MM-DD HH:mm:ss')
      );*/
      console.log(
        'decodedToken expiry date: ',
        moment(decodedToken.exp).format('YYYY-MM-DD HH:mm:ss')
      );
      console.log(
        'current date: ',
        moment(d.getTime()).format('YYYY-MM-DD HH:mm:ss')
      );
      console.log('decodedToken expiry date: ', decodedToken.exp);
      console.log('current date: ', d.getTime());
      console.log('Time difference: ', decodedToken.exp - d.getTime());

      if (d > decodedToken.exp) {
        console.log('Time is up...');
        this.terminateSession();
        return false;
      }
      return true;
    } else {
      // There is no token so session is automatically invalid
      this.terminateSession();
      return false;
    }
  }

代币:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NDQsImVtYWlsIjoidGVzdEBlbWFpbC5jb20iLCJmaXJzdE5hbWUiOiJ0ZXN0Iiwic3VybmFtZSI6InVzZXIiLCJyb2xlIjoiYWdlbnQiLCJpYXQiOjE2MTg1NTYyOTE3MzAsImV4cGlyeSI6MTYxODU1OTg5MTczMCwiZXhwIjozMjM3MTE2MTgzNDYwfQ.nUrUFzyyP9POBTklc8ISXamJIz8D9vaUOIdS81_F9FY

【问题讨论】:

  • 我通过简单地在 jwt 正文中添加一个带有我自己的到期日期的额外字段来解决它,但我仍然很想知道发生了什么。

标签: javascript node.js jwt


【解决方案1】:

解码后的payload是:

{
...
  "iat": 1618556291730,
  "expiry": 1618559891730,
  "exp": 3237116183460
}

有两点不对:

  1. 时间戳的格式错误,因为它应该以秒(10 位数字)而不是毫秒(13 位)为单位(请参阅NumericDate in RFC7519)。

  2. 到期时间(除因子 1000 之外)是预期的两倍。

原因是您调用jwt.sign 中的expiresIn 参数计算错误。 parameter 应该是一个时间跨度,例如{ expiresIn: 60 * 60 }{ expiresIn: "1h" } 一小时,而不是时间戳。 然后sign 函数会将参数的时间跨度与当前时间相加,以计算出正确的exp

【讨论】:

  • 谢谢你。我不知道时间戳格式,但真正让我困惑的是过期时间。我把日期和时间放在exp 中的原因是因为无论我做什么,我都会得到错误的到期日期。尽管它回答了我的问题,但我会将您的答案标记为正确的答案。再次非常感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
相关资源
最近更新 更多