JWT 验证原因 ERR_HTTP_HEADERS_SENT
JWT Verify Causing 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
作为库来进行验证。
发生的事情是你使用回调,而函数的其余部分继续进行,所以直到回调发生你已经发送了 headers
try{
// Verify the token
jwt.verify(
token,
getKey,
{
algorithm: process.env.JWT_ALGORITHM
})
return next()
}
catch(e){
res.send(401)
return
}
我们正在使用 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
作为库来进行验证。
发生的事情是你使用回调,而函数的其余部分继续进行,所以直到回调发生你已经发送了 headers
try{
// Verify the token
jwt.verify(
token,
getKey,
{
algorithm: process.env.JWT_ALGORITHM
})
return next()
}
catch(e){
res.send(401)
return
}