2013-06-12 57 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( '成功',「登陸在成功'));

希望這帶來了曙光的情況爲你或其他人尋求幫助