比较 JWT 过期时间到现在,总是错误的,节点 Angular 4 应用程序

Posted

技术标签:

【中文标题】比较 JWT 过期时间到现在,总是错误的,节点 Angular 4 应用程序【英文标题】:comparing JWT expired time to now, always false, node Angular 4 app 【发布时间】:2018-04-13 21:28:44 【问题描述】:

当用户从节点服务器登录时,我正在签署 JWT,使用 express 发送到 Angular 客户端。

我遇到的问题是在检查过期时间是否超过当前时间时,总是错误

服务器端:

var jwt = require('jsonwebtoken');

  const token = jwt.sign(
      'name': admin.name
    , RSA_PRIVATE_KEY, 
      algorithm: 'RS256',
      expiresIn: 7200,
      subject: adminId
    );

客户端:

  private setSession(authResult) 
    const decoded = jwt_decode(authResult.token)
    const exp = decoded.exp;
    this.username = decoded.name;
    this.adminId = decoded.sub;
     console.log(exp)// returns 1509551526
    localStorage.setItem('id_token', authResult.token);
    localStorage.setItem("expires_at", exp);
  

当令牌被解码时,exp 声明返回 1509551526(当时)

我使用下面的函数比较它们:

  public isLoggedIn() 
    var current_time = new Date().getTime() / 1000;
    console.log(current_time)
    if (current_time > this.getExpiration()) 
      console.log("Expired!")
    
  

current_time 返回 1509544328.137(当时)所以:

if (1509544328.137 > 1509551526)

或者

if (2017-11-01 13:52:08 > 2017-11-01 15:52:06)

我已经记录了两个变量的 typeof,它们都是数字

【问题讨论】:

【参考方案1】:

尝试在比较中使用+ 运算符:

if (+current_time > +this.getExpiration()) 
  console.log("Expired!")

或者确保您将 .getTime() 与 Date 对象一起使用。

您发布的那些条件应该等同于false;第一个值小于第二个。还是您没有得到正确的到期时间?

如果 (1509544328.137 > 1509551526)

【讨论】:

感谢您的回答 Milo“您发布的那些条件应该等于 false”让我将代码重构为:return current_time 【参考方案2】:

在 Node.js 中比较当前时间和过期时间

Example For OTP Expire time verification '''

let currentTime = new Date();
let otpData = await Otp.findOne(otpNumber: req.body.otp, user: user._id);
if (!otpData) return res.status(400).send('OTP is invalid.');

if (currentTime.getTime() > otpData.expiresAt.getTime())
    res.send('OTP is expired');

else
    otpData.isUsed = true;
    await otpData.save();   
    res.send('OTP Verified');

'''

【讨论】:

以上是关于比较 JWT 过期时间到现在,总是错误的,节点 Angular 4 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使节点 js 中的 jwt 过期?

尝试进行身份验证时 JWT 令牌过期?

Nodejs jwt 令牌永不过期

jwt令牌过期后如何注销

一篇文章教你如何使用egg-jwt生成jwt+校验+错误拦截+设置过期时间

ttl 在 JWT Auth Laravel 中未过期