【问题标题】:Passport (local) is hanging on Authentication护照(本地)挂在身份验证上
【发布时间】:2014-03-17 15:09:11
【问题描述】:

我的护照本地策略设置如下,任何一个失败案例都可以正常工作。但是,在我验证服务器日志“d1”然后挂起的情况下,请求仍处于“待处理”状态:

passport.use(
    new LocalStrategy({
        usernameField: 'email',
        passwordField: 'password'
    },
    function(email, password, done) {
        User.getUser(email, password).then(function(users){

            if(users && users.length == 1) {
                console.log('d1')
                return done(null,users[0]) ; 
            } else {
                console.log('d2')
                return done(null, false, { message: 'Incorrect credentials.' });
            }
        }, function(e){
            console.log('d3')
            return done(null, false, { message: 'Incorrect credentials.' });
        });
    })
);

passport.serializeUser(function(user, done) {
    console.log('s1')
    done(null, user);
});

passport.deserializeUser(function(user, done) {
    console.log('s2')
    done(null, user);
});


server.post(authPostRoute
    , passport.authenticate('local',{
        successRedirect : "/ideas",
        failureRedirect : "/",
    })
);

理想情况下,我不想在成功/失败时重定向,而是将一些 JSON 返回到浏览器。但我似乎无法让这个简单的场景发挥作用。

更新 - 追踪到 passport-local/strategy.js

上面完成的是来自 strategy.js 的这个函数

   function verified(err, user, info) {
    if (err) { return self.error(err); }
        if (!user) { return self.fail(info); }

    //console.log(self.success.toString())
    self.success(user, info);
   }

这一切都很好。 self.success 似乎是一个有效的函数,但它没有被调用,据我所知。

更新二: passport/authenticate.js

看起来success是一个在passport/authenticate.js中定义的函数

strategy.success = function(user, info) {

}

我好像明白了

req.logIn(user, options, function(err) {

但从不进入函数。我是否缺少登录的定义?

更新三:登录

追踪到 passport/http/prequest.js,这行显然是导致问题的原因

if (!this._passport) throw new Error('passport.initialize() middleware not in use');

虽然我以为我是这样启用的:

server.use(passport.initialize());

编辑更新 IV: 移动 passport.initialize

我在流程中较早地移动了护照初始化,现在成功和错误重定向似乎有效。

但我仍然无法控制对客户端的响应。我不想重定向。这是一个不同的问题吗?

【问题讨论】:

  • 我假设您已经检查过了,但是在 .then 成功函数中返回的 users 变量真的是一个数组吗? getUser 听起来它会返回一个对象。那么也许users[0] 失败了?

标签: node.js express passport.js


【解决方案1】:

我遇到了类似的问题并解决了passport.initialize到更早的行解决了这个问题,非常感谢。

但我仍然无法控制对客户端的响应。我不 想要重定向。这是一个不同的问题吗?

如果有人有这个问题; 对于自定义逻辑,您可以使用这样的回调。

router.post('/login', function(req, res, next) {
    passport.authenticate('local-signin', function(err, user, info) {
      if (err) { return next(err); }
      if (!user) {
        return res.render('account/login', {
          pageTitle: 'Sign in',
          form: req.body
        });
      }
      req.logIn(user, function(err) {
        if (err) { return next(err); }
        return res.redirect('/myaccount');
      });
    })(req, res, next);
});

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 2016-10-29
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多