背景
我想使用jwt和护照建立一个简单的身份验证。我想在某些路由(在此示例中为“ / findUsers”)之前验证jwt令牌,以查看其是否正常工作。
发生了什么事?
我能够登录并生成令牌。然后,当我进入应该检查jwt令牌的findUsers路由时,它只发送消息“无身份验证令牌” 。
我为解决该问题所做的尝试?
在登录路由器上,我尝试在创建令牌后手动设置令牌。 我遇到了这个问题How can I set response header on express.js assets 并尝试了几个答案,包括使用res.set('authorization',token),res.set('jwt',token),res.set('authorization','bearer'+ token)将令牌设置为标头是手动的,但没有一个起作用。对于每种方法,我都尝试更改了在password.js jwt策略内传递的选项中使用的Extract.jwt提取令牌的方式,但没有一种有效。 我还尝试根据上面提到的线程中的答案之一来公开标头,但是它不起作用。 请注意,在登录路径上执行jwt.sign之后,在其中放置了res.set({Authorization:token})。然后,在“ findUsers”路径上,我放置了console.log(JSON.stringfy(req。标头)),但即使我按照上述方法手动设置它也没有“授权”标头,也没有标记的迹象。 console.log的输出是这样的:
“主机”:“本地主机:3000”,“连接”:“保持活动”,“升级不安全请求”:“ 1”,“用户代理”:“ Mozilla / 5.0 (Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,如Gecko) 铬/78.0.3904.108 Safari / 537.36“,” sec-fetch-user“:”?1“,” accept“:” text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp,image / apng,< em> / ; q = 0.8,application / signed-exchange; v = b3“,” purpose“:”预取“,” sec-fetch-site“:”无“,” sec-fetch-mode“ :“导航”,“接受编码”:“ gzip, 放气 br“,” accept-language“:” pt-BR,pt; q = 0.9,en-US; q = 0.8,en; q = 0.7“,” if-none-match“:” W / \“ d- V7HLaL2hmB4U + t6toiVjp7rT3Rc \“”}
以下是我认为与该问题相关的一些代码:
Passport.js(jwt和登录策略)
const options = {
jwtFromRequest:ExtractJWT.fromAuthHeaderWithScheme('JWT'),
secretOrKey:jwtSecret.secret
};
passport.use(
'jwt',
new JWTStrategy(options,(jwt_payload,done)=>{
console.log('jwt from request '+options.jwtFromRequest);
try{
User.findOne({
where:{
id:jwt_payload.id
},
}).then(user=>{
if(user){
console.log('User found in DB in passport')
done(null,user)
}else{
console.log('User not found in db');
done(null,false)
}
});
} catch(err){
done(err)
}
})
)
passport.use(
'login',
new localStrategy(
{
usernameField:'email',
passwordField:'password',
},
(username,password,done)=>{
try{
User.findOne({
where:{
email:username
}
}).then(user=>{
if(user === null){
return done(null,false,{message:'Enter a correct Email or CNPJ'})
} else{
bcrypt.compare(password,user.password).then(response=>{
if(response !== true){
console.log('Incorrect Password')
return done(null,false,{message:'Incorrect Password'})
}
console.log('User'+ user + 'authenticated');
return done(null,user);
});
}
})
} catch(err){
done(err)
}
}
)
);
登录路由器
router.post('/', (req,res,next)=>{
passport.authenticate('login',(err,user,info)=>{
if(err){
console.log(err)
}
if(info !== undefined){
console.log(info.message + 'line 17');
res.send(info.message);
}else{
req.logIn(user,err=>{
console.log('user>'+JSON.stringify(user))
const token = jwt.sign({id:user.id},jwtSecret.secret);
res.set({Authorization:token})
res.status(200).send({
auth:true,
token:token,
message:'User found & logged in'
})
})
}
})(req,res,next)
})
findusers路由(我正在实现jwt身份验证的路由)
router.get('/',(req,res,next)=>{
console.log(JSON.stringify(req.headers))
passport.authenticate('jwt',{session:false},(err,user,info)=>{
if(err){
console.log(err)
}
if(info !== undefined){
console.log(info.message);
res.send(info.message);
} else{
console.log('User found in Db from route');
res.status(200).send({
auth:true,
name:user.name,
email:user.email,
password:user.password,
cnpj:user.cnpj,
message:'user found in db'
})
}
})(req,res,next)
})
感谢您的帮助!