【问题标题】:How to gracefully catch jsonwebtoken errors in node & express?如何优雅地捕获节点中的 json Web 令牌错误并表达?
【发布时间】:2023-03-13 12:09:01
【问题描述】:

这是我的验证功能:

exports.validateToken = function(req, res, next){
  var token = req.body.token;
  jwt.verify(token, config.sessionSecret, function(err, decoded) {
     if(err){
         return next(err);
     }else{

        var userToken = jwt.sign(req.body.user, config.secret,{
            expiresIn:10000
        });

        res.json({token: userToken})

    }    
  });
}

我期待一个错误定义,但我收到了一个内部服务器错误:

TokenExpiredError: jwt expired
at Object.JWT.verify (/Users/Developer/node_modules/jsonwebtoken/index.js:209:19)
at exports.validateToken (/Users/Developer/app/controllers/user.signing.controller.js:369:9)
at Layer.handle [as handle_request] (/Users/Developer/node_modules/express/lib/router/layer.js:76:5)
at next (/Users/Developer/node_modules/express/lib/router/route.js:100:13)
at Route.dispatch (/Users/Developer/node_modules/express/lib/router/route.js:81:3)
at Layer.handle [as handle_request] (/Users/Developer/node_modules/express/lib/router/layer.js:76:5)

我在这里做错了什么?

【问题讨论】:

  • 错误行是指向return next(err);还是var userToken = jwt.sign(req.body.user, config.secret,{
  • 无。到 jwt.verify(...
  • 那么问题是,为什么return next(err); 不接收和处理err
  • 是的。我还尝试了 try{..}catch(err){...} 以确保问题不会返回 next(err)。但同样的情况。
  • 我看不出这个库有什么问题:github.com/auth0/node-jsonwebtoken/blob/master/index.js#L243 - 那是你正在使用的模块吗?

标签: javascript node.js express json-web-token


【解决方案1】:
const jwt = require('jsonwebtoken')

module.exports =  function auth (req,res,next) {
    const token =req.header('x-auth-token')
    if (!token){
        return res.status(401).send('to\'ken not found')
    }
 try{
        const decoded = jwt.decode(token,'m@hf1y')
         req.user = decoded
         next()

 }catch (e) {
     
     return  res.status(400).send('invalid token')
 }
}

编辑

警告:这是使用 jwt.decode 而不是 jwt.verify。由于 JSON Web Token 总是可以在不知道密钥的情况下被解码,所以之前的代码只有在它来自 thrusted 源时才有效。

【讨论】:

    【解决方案2】:

    由于某种原因,下一个响应不起作用。所以我用下面的代码替换了它,一切都很好:

    res.status(401).send({error:'invalid token'});
    

    【讨论】:

    • 为什么不是401 未经授权的回复?
    【解决方案3】:

    我已经在我的代码中尝试过这个。 res.locals.data 有助于将数据传送到调用函数。

    只需在调用函数中获取res.locals.data 的数据即可,希望您的问题得到解决。

    if (err) {
        res.locals.data = {
            err: err.name,
            message : err.message
        }
        return next();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      相关资源
      最近更新 更多