passport.authenticate回调未被执行

时间:2017-11-06 15:27:02

标签: javascript node.js express passport.js

我正在使用nodejs v8.7.0开发后端, 对于使用护照和本地护照的身份验证,我之前使用过这个,一切顺利,但现在我不知道是什么问题,这是我的代码:

我的策略:

var passport = require('passport')
var LocalStrategy = require('passport-local').Strategy
    passport.use('local', new LocalStrategy({
            usernameField: 'email'
        },
        function (email, password, done) {
            User.findOne({
                email: email,
                is_admin: false
            }, function (err, user) {
                if (err) {
                    return done(err)
                }
                // Return if user not found in database
                if (!user) {
                    return done(null, false, {
                        message: 'User not found'
                    })
                }
                // Return if password is wrong
                if (!user.validPassword(password)) {
                    return done(null, false, {
                        message: 'Password is wrong'
                    })
                }
                // If credentials are correct, return the user object
                return done(null, user)
            })
        }
    ))

这是电话会议的地方:

router.post('/login', (req, res) => {
    try {
        passport.authenticate('local', function (err, user, info) {
            console.log('here xx')

            var token;
            if (err) {
                console.log(err);
                return res.status(401).json(err);
            }
            // If a user is found
            if (user) {
                console.log('here')

                token = user.generateJwt();
                return res.status(200).json({
                    "token": token
                });
            } else {
                // If user is not found
                res.status(401).json(info);
            }
        })

    } catch (reason) {
        res.status(501).json({
            message: reason.message
        })
    }
})

问题是我得到的东西没有像来自console.log的消息或类似错误的东西,它没有执行来自passport.authenticate的回调....就像注册新用户和一切都运行良好的方式 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:8)

Passport应该用作middleware。在您的路线中使用它:

router.post('/login', passport.authenticate('local'), (req, res) => { })

在您的路线中,您可以访问req.user

如果您不使用中间件,则可以使用回调。但您需要传递reqresnext

例如:

passport.authenticate('local', function (err, user, info) {

})(req, res, next)

这是一个完整的示例,请注意,这不是使用中间件,因为在这种情况下,您要定义自定义消息,并且需要使用回调来获取信息。

router.post('/login', (req, res) => {
    passport.authenticate('local', function (err, user, info) {      
        if (err) {
            return res.status(401).json(err);
        }
        if (user) {
            const token = user.generateJwt();
            return res.status(200).json({
                "token": token
            });
        } else {
            res.status(401).json(info);
        }
    })(req, res, next)
})

答案 1 :(得分:0)

当您使用 passport.authenticate 作为回调时,您的应用程序有责任建立会话(通过调用 req.login())并发送响应。

这里是 passport.js 文档的链接,可以提供帮助: http://www.passportjs.org/docs/authenticate/