无法从标题中获取jwt令牌

时间:2019-12-13 17:48:48

标签: node.js express jwt passport.js passport-jwt

背景

我想使用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)
    })

感谢您的帮助!

0 个答案:

没有答案