护照用JWT登录

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (23)

我正在尝试使用passport.js实现登录端点。我的用户架构包含昵称和密码。到目前为止app.js我有:

require('./config/passport');
app.use('/user',  passport.authenticate('jwt', {session: false}), require('./routes/user/login.js'));

我要求我的文件passport.js有护照策略配置:

passport.use(new LocalStrategy({ usernameField: 'nickname' }, (nickname, password, done) => {
        User.findOne({ nickname: nickname })
            .then(user => {
                if(!user) {
                    return done(null, false, { message: 'Email and/or password is not valid' });
                }
                bcrypt.compare(password, user.password, (err, isMatch) => {
                    if(err) throw err;
                    if(isMatch) {
                        return done(null, user);
                    } else {
                        return done(null, false, { message: 'Email and/or password is not valid' });
                    }
                });
            });
    })
);

passport.use(new JWTStrategy({
        jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
        secretOrKey: keys.secretJWT
    },
    function (jwtPayload, cb) {
        return User.findOneById(jwtPayload.id)
            .then(user => {
                return cb(null, user);
            })
            .catch(err => {
                return cb(err);
            });
    })
);

在app.js(第一个片段)中,/user我需要实际的端点,即:

router.post('/login', function (req, res, next) {
    passport.authenticate('local', {session: false}, (err, user, info) => {

        console.log(info);

        if (err || !user) {
            return res.status(400).json({
                message: 'Email and/or password is not valid',
                user: user
            });
        }
        req.login(user, {session: false}, (err) => {
            if (err) next(err);
            //generate a signed JWT with the contents of user object and return it in the response
            const token = jwt.sign(user, keys.secretJWT);
            return res.json({user, token});
        });
    })(req, res);
});

所以最后在调用时调用它/user/login。对我来说奇怪的是,console.log(info);从来没有真正的控制台,我无法在我的节点应用程序运行的终端中看到它。

我传递了有效的昵称和密码,但我总是得到401 Unauthorized:

我错过了什么?也许是因为我没有通过令牌?但登录时我不知道令牌。它应该是登录的回应。然后我将使用令牌进一步请求进行身份验证。

提问于
用户回答回答于

我认为你在passport.use()函数中缺少策略别名。您jwt在路由器中使用别名: passport.authenticate('jwt', {session: false})

所以你的passport.use()函数应该如下所示:

passport.use('local', new LocalStrategy(...), function(payload, cb){...})
passport.use('jwt', new JWTStrategy(...), function(payload, cb){...})

否则,您无法使用别名匹配正确的策略。此外,在登录控制器中,您必须使用“本地”别名来呼叫护照。

热门问答

我刚申请的服务器,缺省给我的是linux,可我要Windows,怎么办?

蒋小爱

腾讯云 · 技术支持 (已认证)

推荐
云服务器提供 不同平台重装:仅支持中国大陆地区(不含中国香港)。 例如,Linux 重装为 Windows,Windows 重装为 Linux 。 参考 重装系统: https://cloud.tencent.com/document/product/213/4933 图片.p...... 展开详请

合作伙伴学院里的学习视频测试题和在线培训系统里的测试题能否提供答案?

骑牛看晨曦love&peace~
推荐

http://tencentcloudxuexi.com 合作伙伴可以登录此平台做练习题,有答案的喔

云服务器不能访问外部网站?

HappyLau谈云计算

腾讯云 · 云计算高级工程师 (已认证)

专注于公有云,私有云解决方案,在kubernetes,openstack,kvm,ceph,linux,shell有丰富的实战经验。
推荐
不能访问外部网站一般是网络和dns的问题,按照如下步骤排查: 1. 确保CVM有外网ip或者NAT转换,使用ping测试下外网的连通性,如果不通请购买弹性公网IP,先申请后购买参考https://cloud.tencent.com/document/product/215/201...... 展开详请

关于Linux DNS服务器设置问题?

mariolu

腾讯 · 后台开发工程师 (已认证)

CDN及云从业者
推荐

CNAME到XX.com,这个XX.COM本身也是需要能解析ip的。CNAME到XX.COM的意义是你能解析到CDN厂商A的域名XX.COM或者CDN厂商B的域名YY.COM。所以需要提供服务的CDN厂商给你他们的域名。这样,DNS查询链路才是完整的。

两台腾讯云的服务器在同一个地区,内网网段也相同,都是172.17.0.X,为啥ping内网地址不通?

HappyLau谈云计算

腾讯云 · 云计算高级工程师 (已认证)

专注于公有云,私有云解决方案,在kubernetes,openstack,kvm,ceph,linux,shell有丰富的实战经验。
推荐已采纳

首先看下两台机器是否在同个vpc内,在同个vpc内默认网络可以互通,如果不在同个vpc内需要通过对等连接或者云联网打通,如果在同个vpc下无法互通,请检查下安全组和os的防火墙规则,放行icmp连接。

求问keil5项目无法下载到开发板该怎么解决?

Supowang

腾讯 · 高级工程师 (已认证)

腾讯物联网操作系统TencentOS tiny产品接口人---岁寒知松柏,做最好的自己!
推荐
请检查st-link的驱动和stlink硬件,如果不行,尝试换其他stlink下载器试试,谢谢! 如果还没有解决,请加TencentOS tiny官方QQ群提问,谢谢! qq.png ... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券