jsonwebtoken,当提供了无效的令牌时,即使errorHandler中间件捕捉到错误,jwt也会使我的应用程序崩



完整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)

我在经历可能相同的课程时遇到了同样的问题。

因此,我遇到了服务器停止/崩溃/死亡的问题,因为使用的几个库中出现了任何错误。Jsonwebtoken、mongoose、bcryptjs都会遇到同样的问题——如果它们得到任何类型的意外数据,就会抛出一个错误,从而停止服务器。看起来这些问题必须由errorHandler中间件来处理,该中间件是在(next(使服务器等待下一个命令/请求的过程中编写的但是如果jsonwebtoken在";授权:持票人***";标头或令牌格式不正确(手写的无意义令牌(或令牌已过期,服务器将停止。只有当令牌有效时,它才会停止。

如果mongoose获得了一些(任何(不符合模型中写入的验证要求的数据,它会抛出一个错误,导致服务器停止。

如果bcrypt没有得到要解析/验证/解密的密码,它会抛出一个错误,导致服务器停止。

然后,突然间,我发现我错过了添加名为express async error的库。课程清楚地说明了这一步骤,即必须将每一个";等待";内部";异步;带有try/catch块的函数;捕获"-捕获错误,或者(!(安装express异步错误库。所以我已经读了5遍了,直到我明白我已经删除了所有的try/catch块,并且没有安装这个库。

因此,这解决了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的p.S.错误看起来完全相同,我的意思是,在我添加express异步错误库之前,它们有相同的结构,这就是我提到它们的原因

最新更新