首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JWT登录passport

使用JWT登录passport
EN

Stack Overflow用户
提问于 2019-06-13 20:48:45
回答 1查看 80关注 0票数 1

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

代码语言:javascript
复制
require('./config/passport');
app.use('/user',  passport.authenticate('jwt', {session: false}), require('./routes/user/login.js'));

我需要我的文件passport.js,其中有passport策略配置:

代码语言:javascript
复制
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);
            });
    })
);

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

代码语言:javascript
复制
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未经授权:

我遗漏了什么?也许是因为我没有传递token?但在登录时,我不知道令牌。它应该是对登录的响应。然后,我将在进一步的请求中使用令牌进行身份验证。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56580889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档