如何解决JWT验证导致ERR_HTTP_HEADERS_SENT
我们正在使用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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。