NodeJS jsonwebtoken,即使errorHandler中间件捕获错误,当提供无效令牌时,jwt仍会使我的应用程序崩溃

ffx8fchx  于 2023-01-08  发布在  Node.js
关注(0)|答案(2)|浏览(183)

完整的github存储库https://github.com/suubcity/fso-blog-list/tree/bb3b8f623da4d9a5dcf87c2d82ccf3715dfbd3fb
将无效标记发送到此代码行时...

const decodedToken = jwt.verify(req.token, process.env.SECRET);
            'TYPEOF:',

我想用下面的错误处理器来处理它。错误处理器工作,我得到状态码和json返回,但我的应用程序仍然崩溃。我如何防止崩溃?
中间件

const errorHandler = (err, request, res, next) => {
    logger.error(err.message);

    if (err.name === 'ValidationError') {
        return res.status(400).json({ error: err.message });
    } else if (err.name === 'JsonWebTokenError') {
        res.status(401).json({ error: 'invalid token' });
    }

    next(err);
};

错误讯息

Connected to MongoDB
Server running on port 3001
invalid signature
POST /api/blogs 401 25 - 9.366 ms
JsonWebTokenError: invalid signature
    at /home/martyn/Documents/projects/fso-blog-list/node_modules/jsonwebtoken/verify.js:133:19
    at getSecret (/home/martyn/Documents/projects/fso-blog-list/node_modules/jsonwebtoken/verify.js:90:14)
    at Object.module.exports [as verify] (/home/martyn/Documents/projects/fso-blog-list/node_modules/jsonwebtoken/verify.js:94:10)
    at /home/martyn/Documents/projects/fso-blog-list/controllers/blogs.js:13:27
    at newFn (/home/martyn/Documents/projects/fso-blog-list/node_modules/express-async-errors/index.js:16:20)
    at Layer.handle [as handle_request] (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/route.js:112:3)
    at newFn (/home/martyn/Documents/projects/fso-blog-list/node_modules/express-async-errors/index.js:16:20)
    at Layer.handle [as handle_request] (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/layer.js:95:5)
    at /home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:335:12)
    at next (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:275:10)
    at Function.handle (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:174:3)
    at router (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:47:12)
    at newFn (/home/martyn/Documents/projects/fso-blog-list/node_modules/express-async-errors/index.js:16:20)
iezvtpos

iezvtpos1#

我在学习同样的课程时也遇到过同样的问题。
所以,我遇到了一个服务器停止/崩溃/死亡的问题,这是由于使用了几个库。Jsonwebtoken,mongoose,bcryptjs都有同样的问题--如果它们得到任何类型的意外数据,它们抛出一个错误,使服务器停止。看起来这些问题必须由课程中编写的errorHandler中间件来处理(next)使服务器等待下一个命令/请求但是如果jsonwebtoken在“授权:bearer***”头或令牌格式错误(手写无意义令牌)或令牌过期时,服务器停止。只有令牌有效时,服务器才会停止。
如果mongoose得到了一些(任何)不符合模型中所写的验证要求的数据,它就会抛出一个错误,导致服务器停止。
如果bcrypt没有得到密码来解析/验证/解密-它会抛出一个错误,导致服务器停止。
然后,突然,我发现我错过了添加一个叫做express-async-error的库,课程中清楚地说明了这一步,要么用try/catch块将“await”的每个调用 Package 在“async”函数中,用“catch”捕获错误,或(!)安装express-async-error库。所以我已经通读了5遍,直到我明白我已经删除了所有的try/catch块,并且没有“t安装此存储库。
所以,这解决了mongoose和bcrypt的所有问题,但是jsonwebtoken仍然不想在没有授权头或空令牌时停止服务器崩溃。
我的解决方案是添加另一个在jwt.verify(req.token, process.env.SECRET)之前返回错误的中间件。

const verifyToken = (request, response, next) => {
  const authorization = request.get('authorization')
  const token =
    authorization && authorization.toLowerCase().startsWith('bearer ')
      ? authorization.substring(7)
      : null

  if (!request.headers.authorization) {
    return response.status(401).json({ error: 'Authorization required' })
  }
  if (token === 'null') {
    return response.status(401).json({ error: 'token missing' })
  }
  const payload = jwt.verify(token, config.SECRET)
  if (!payload) {
    return response.status(401).json({ error: 'token missing or invalid' })
  }
  request.userId = payload.id
  request.token = token
  next()
}

另外,mongoose和bcryptjs的错误看起来完全一样,我的意思是,在添加express-async-error库之前,它们具有相同的结构,这就是我提到它们的原因

bhmjp9jg

bhmjp9jg2#

我也遇到了同样的问题...简单的解决方法是使用try和catch。

相关问题