【问题标题】:How can you verify if a JWT is still valid?如何验证 JWT 是否仍然有效?
【发布时间】:2019-02-17 15:01:20
【问题描述】:

我想每隔 X 分钟从客户端打一个电话,看看 JWT 是否仍然有效。我不确定如何在 nodeJS 中执行此操作。如果我已经获得授权,我如何检查我是否仍然获得授权。

【问题讨论】:

  • 我不会在设定的时间间隔内这样做 - 它应该在每个需要身份验证的请求上完成。
  • 我正在检查不活动。如果令牌由于不活动而过期,我想将应用程序发送回登录页面。

标签: node.js reactjs jwt


【解决方案1】:

处理令牌过期的一个优雅的解决方案是,当您设置令牌时(在LocalStorage 或 store(redux),或两者中)也有一个在令牌过期时运行的异步函数。像这样的:

const logUserOut = token =>{
    setTimeout(()=> MyLogoutFunction(), token.expiresIn)
}

这样可以确保在令牌不再有效时不会记录用户。

【讨论】:

  • 如果用户刷新页面,定时器停止,token会被永久保存,该如何解决?
  • 这通常是在服务器端完成的,每次用户启动应用程序(通过刷新或第一次打开)时,都会从客户端发送一个验证请求以验证 JWT 的有效性。跨度>
【解决方案2】:

您可以让您的客户端解码 JWT 并检查 expiry 字段并将其与系统时间进行比较。

例如。

  isExpired: (token) => {
    if (token && jwt.decode(token)) {
      const expiry = jwt.decode(token).exp;
      const now = new Date();
      return now.getTime() > expiry * 1000;
    }
    return false;

您可以在客户端使用 npm install jsonwebtoken 或其他一些 npm 包来执行此操作

【讨论】:

  • 并使用 setInterval 每隔几秒调用一次此函数?这不是性能问题吗?
  • 您在 HOC 中使用它的方式与检查商店的身份验证状态相同。
【解决方案3】:

创建验证令牌有效的端点。您可以使用 jsonwebtoken 包。

import jwt from 'jsonwebtoken';

const verifyToken = (req, res) => {
  const token = req.headers.authorization;
  jwt.verify(token, SECRET_KEY, (err, decoded) => {
    if (err) {
      return res.status(401).send();
    }
    // can do something with the decoded data
  })
}

router.post('/verify-token', verifyToken);

【讨论】:

    【解决方案4】:

    我找到了一个更好的选择,承诺检查我的令牌是否有效

        jwt.verify(token,key,(err,result)=>{
        if(err){
            if(err.name == "TokenExpiredError"){
                console.log("Expired") //This case is when token expired
            }
            else{
                console.log(err.name) //Any other case
            }
        }
        else{
            //Here code for your promise using 'result' when token is Valid
        }
    })
    

    编辑:如果您出于安全原因不使用 JWT,则此代码是可以的,前提是您将其用于公共内容。 因为此请求是否有效,如果无效,则向用户显示。 我使用它只是为了了解对象是否由于其他原因仍然可用。 (而且可以公开)

    【讨论】:

    • 正在阅读本文的人,如果您使用 HMAC 算法,则不应在客户端使用上述代码。你不应该公开你的密钥。
    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2021-07-13
    • 2013-06-24
    相关资源
    最近更新 更多