【问题标题】:Node.js Passport not calling next functionNode.js Passport 没有调用下一个函数
【发布时间】:2016-07-16 04:11:20
【问题描述】:

我正在使用 Node 构建一个应用程序,该应用程序使用 Passport.js 来处理使用本地数据库的用户登录。

因此,当用户转到 /profile 时,我会调用以下代码。成功登录后,用户被重定向到 /profile。根据摩根的说法,这确实发生了。

app.get('/profile', passport.authenticate('local-login', { session : false, failureRedirect : '/login' }), function(req, res) {
    console.log("testnow");
    res.render('profile.ejs', {
        user : req.user // get the user out of session and pass to template
    });
});

我的本​​地登录代码如下。

passport.use('local-login', new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) { // callback with email and password from our form
    // find a user whose email is the same as the forms email
    // we are checking to see if the user trying to login already exists
    User.findOne({ 'local.email' :  email }, function(err, user) {
        // if there are any errors, return the error before anything else
        if (err)
            return done(err);

        // if no user is found, return the message
        if (!user)
            return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash

        // if the user is found but the password is wrong
        if (!user.validPassword(password))
            return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata

        // all is well, return successful user
        console.log("testdone");
        return done(null, user);
    });
}));

在测试代码时,我登录并在瞬间重定向到配置文件。控制台打印了我的本地登录代码中的“testdone”,但没有像预期的那样打印“testnow”。这意味着我的 /profile get 方法中的第二个函数似乎永远不会被调用,即使本地登录正在调用下一个函数。

因此,从最终用户的角度来看,您登录(在幕后您会被重定向到 /profile 以进行拆分部分),然后 /profile 会将您重定向回 /login。

关于如何解决此问题以便我的 /profile get 方法中的第二个函数实际被调用的任何想法?

提前非常感谢。我也很乐意提供任何其他信息来帮助解决这个问题。

【问题讨论】:

  • 尝试在 pasport.authenticate 的选项对象中添加一个属性:successRedirect : '/profile' 并在成功的情况下创建一个路由/profile,我不知道护照是否在你之后调用下一个函数'正在验证省略successRedirect
  • @FernandoZamperin 添加成功重定向 /profile 会导致无限循环正确吗?
  • 抱歉我误会了!!!尝试成功重定向到另一条路线只是为了测试目的,看看问题是否是护照没有调用下一个
  • @FernandoZamperin 是的,那没用。仍然重定向到 /login。将其更改为“app.get('/profile', passport.authenticate('local-login', { session : false, successRedirect: '/', failureRedirect : '/login' }), function(req, res) { " 并且仍然重定向到 /login 而不是 /
  • @FernandoZamperin 否,但如果会话设置为 false Passport 将永远不会知道用户已成功登录 :)

标签: javascript node.js passport.js


【解决方案1】:

passport.authenticate() 用于处理实际身份验证;换句话说,获取登录凭据并将它们传递给策略。如果请求已经过身份验证,它并不意味着传递请求,而这正是您尝试使用它的目的。

相反,您想使用connect-ensure-login 之类的东西来保护用户必须登录的路由。

另见this Passport example project

【讨论】:

  • 好酷。所以几乎必须改变我的方向。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2021-01-08
  • 2012-11-13
  • 2017-01-01
相关资源
最近更新 更多