问题描述
我们正在使用Restify(Node.js)开发ReST API。作为身份验证机制的一部分,我们开发了一种中间件,其目的是筛选传入令牌并进行验证。但是,查看日志,会弹出与ERR_HTTP_HEADERS_SENT相关的多个错误。
这是中间件的代码:
var client = jwksClient({
strictSsl: false,jwksUri: process.env.JWKS_URI
})
// Route middleware to verify a token
server.use(
async (req,res,next) => {
let path = req.route.path.replace(/\?.*$/,'')
let url = req.url
let whitelist = [
// list of endpoints that are left unprotected
]
if(whitelist.indexOf(path) > -1 || whitelist.indexOf(url) > -1){
return next()
}
else {
const r = req
let token = req.headers['x-access-token'] || req.headers['authorization']
// Decode token
token = token.slice(7,token.length).trimLeft()
token = token.trim()
if (token == undefined || token.length <= 0) {
res.send(401)
return
}
try{
// Verify the token
jwt.verify(
token,getKey,{
algorithm: process.env.JWT_ALGORITHM
},(err,decoded) => {
if (err) {
res.end(401)
return
}
else{
next()
}
})
}
catch(e){
res.send(401)
return
}
let email = jwtDecode(token)['email']
// Code here to query database and check whether email is registered
// If no result has been returned
if (email != null && email != undefined && email.length > 0) {
return next()
}
else {
res.send(401)
return
}
}
})
我们使用jsonwebtoken
作为库来进行验证。
解决方法
发生的事情是您使用回调,并且该函数的其余部分继续进行,所以直到发生回调之前,您已经发送了标头
try{
// Verify the token
jwt.verify(
token,getKey,{
algorithm: process.env.JWT_ALGORITHM
})
return next()
}
catch(e){
res.send(401)
return
}