如何验证令牌是不是过期

Posted

技术标签:

【中文标题】如何验证令牌是不是过期【英文标题】:How to verify if the token expired如何验证令牌是否过期 【发布时间】:2018-12-28 02:57:54 【问题描述】:

我想验证令牌是否过期,然后发送状态和消息

 async function verify () 
  const ticket = await client.verifyIdToken(
    idToken: req.body.token,
    audience: CLIENT_ID
  )
  const payload = ticket.getPayload()
  let email = payload['email']
  return User
    .findOne(
      where:  email: email 
    )
    .then(user => 
      if (!user) 
        return next(boom.notFound('User not found'))
      
      let token = jwt.sign(user, config.secret, 
        expiresIn: 86400 // expires in 24 hours
      )
      user.token = token
      return res.status(200).send(user)
    )

verify().catch(console.error)

我一直在处理 client.isTokenExpiring() 但没有发现错误

【问题讨论】:

这是什么类型的令牌?我认为这个问题需要更多的背景来回答。这个函数是签名一个jwt,但是你还想验证上面的idToken?你能提供更多细节吗? 我收到一个谷歌令牌并验证该令牌,然后我从谷歌令牌中提取电子邮件并在我的数据库中查找电子邮件,如果存在我与用户生成一个令牌并返回生成令牌的模型用户。但现在我想做的是:如果 google 令牌已过期,请执行以下操作:res.status(401).json('err': 'Token has expired') 【参考方案1】:

这是对您问题的粗略客户端回答。我记得在您链接到此处的上一篇文章中,您正在研究 Google Web Login,所以我从客户的角度回答了。

我没有和你一样的代码来解决这个问题,但总的来说我是这样做的:

从令牌中提取到期日期。检查当前时间是否晚于或等于令牌的到期时间,然后在您正在使用的身份验证实例上调用 reloadAuthReponse 方法。这将更新您的令牌。事实上,每次计算机从睡眠中唤醒时,我都会这样做。

这个 sn-p 包含来自 moment.js 的辅助函数来比较时间,但总体思路如下:

if(now.isSame(exp) || now.isAfter(exp)) 
    gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse().then(function() 
        // do something with the new token
    );

【讨论】:

以上是关于如何验证令牌是不是过期的主要内容,如果未能解决你的问题,请参考以下文章

刷新令牌是不是过期,如果过期,何时过期?

如何使我的身份验证令牌不会过期?

如何设置 json web 令牌过期和验证

单次使用后如何使两因素身份验证令牌过期

Laravel 护照授权令牌在生成新令牌时过期

如何识别 OAuth 令牌是不是已过期?