【问题标题】:passport.authenticate callback not being executedpassport.authenticate 回调未执行
【发布时间】:2018-04-18 19:35:01
【问题描述】:

我正在使用 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 的回调....顺便说一句,注册新用户等一切都运行良好 有人可以帮忙吗?

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

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

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

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    【解决方案2】:

    护照应用作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)
    })
    

    【讨论】:

    • 您能否再澄清一下当我将它用作中间件时我必须更改的内容?
    • 你需要在你的路由中改变你的实现。删除router.post 中的所有护照代码,并按照我上面提到的方式包含它。我将包含完整的代码。
    • @ettayebmohamed 我更新了我的答案以使用回调方法,这对您来说会更好,因为您在护照中定义自定义消息并希望在您的路线中使用它。
    • 你为什么叫它两次?将它用作中间件将要求使用序列化和反序列化以及会话...我不想要所有这些,我只想通过在回调函数中调用它来使其以简单的方式工作:(
    • 只是复制和粘贴错误。我将其作为中间件删除。这里的关键是您需要通过将(req, res, next) 传递到passport.authenticate 的末尾来执行该函数
    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2019-02-19
    相关资源
    最近更新 更多