2013-06-12 38 views
1

我正在使用passportjs进行Facebook身份验证。这里是我的Facebook策略:passportjs获取身份验证错误消息

passport.use(new FacebookStrategy({ 
     clientID: config.facebook.clientID, 
     clientSecret: config.facebook.clientSecret, 
     callbackURL: config.facebook.callbackURL 
    }, function(accessToken, refreshToken, profile, done) { 
     User.findOne({ 'facebook.id': profile.id }, function (err, user) { 
      if (err) { return done(err); } 
      if (!user) { 
       user = new User({ 
        name: profile.displayName, 
        email: profile.emails[0].value, 
        username: profile.username, 
        provider: 'facebook', 
        facebook: profile._json 
       }); 
       user.save(function (err) { 
        if (err) { 
         console.log(err); 
        } 
        return done(err, user); 
       }); 
      } else { 
       return done(err, user); 
      } 
     }); 
    })); 

我增加了以下路线:

app.get('/facebook/auth', passport.authenticate('facebook', { scope: [ 'email', 'user_about_me', 'publish_actions']}), function(req, res) { }); 

// I need the following fix due to this: http://stackoverflow.com/a/17015836/289246 
app.get('/facebook/auth/callback', function(req, res, next) { 
     if (req.query && !req.query.error && req.query.error_code) { 
      req.query.error = true; 
     } 
     next(); 
    }, 
    passport.authenticate('facebook', { failureRedirect: '/facebook-auth-failure', successRedirect: '/auth-success', failureFlash: true }) 
); 

app.get('/facebook-auth-failure', users.authFailure); 
app.get('/auth-success', users.authSuccess); 

我users.authFailure方法是:

exports.authFailure = function (req, res) { 
    var error = ??? 
    // How can I get here the error message?? 
    res.render('auth-failure', { 
     error: error || 'An error has accured' 
    }); 
}; 

在Facebook验证失败的情况下,我怎么能获取错误信息(我想将其显示给用户)?与护照工作期间

var error = req.flash('error'); 

回答

0

由于您使用failureFlash,这应该这样做。我的解决方案是搬到Everyauth。

+0

当我添加'的console.log(req.flash(“错误”));'到authFailure处理程序,它打印了我'[]'而不是错误。任何想法? – Naor

+2

@Naor flash消息存储在用户的会话中,或许您的会话过期到期了?调试Passport的一个好方法是使用[在此页面上描述的]自定义回调(http://passportjs.org/guide/authenticate/)(搜索'Custom Callback') – robertklep

0

我经历了很多很多问题和漏洞和配置问题:

+0

太糟糕了,我已经使用Passport对于几个项目,它一直工作得很好:) – robertklep

+0

@robertklep:你用过Facebook吗?我没有很高的要求,只有简单的登录,并且失败了一次以上。 – Naor

+0

不是Facebook,但我已经使用了Google和Local策略。我不得不承认,在所有事情都合情合理之前,你必须'取得'护照,'everyauth'看起来也非常成熟:) – robertklep

0

我不知道这是否会对您有任何用处,但我可以通过这种方式访问​​Flash消息。 当您定义FacebookStrategy时,请使用passReqToCallback参数。

passport.use(new FacebookStrategy({ 
    clientID: facebook.getClientID(), 
    clientSecret: facebook.getClientSecret(), 
    callbackURL: facebook.getCallback(), 
    passReqToCallback: true 

这将允许您添加req.flash()作为参数的()完成像这样

回做(假的,用户reg.flash( '成功',“登陆在成功'));

希望这带来了曙光的情况为你或其他人寻求帮助