2013-06-12 2 views
1

Я использую passjs для аутентификации 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, как я могу получить сообщение об ошибке (я хочу показать его пользователю)?

ответ

0

Поскольку вы используете failureFlash, это должно сделать это:

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

Когда я добавляю 'console.log (req.flash («ошибка»));' обработчику authFailure, он выводит меня '[]', а не ошибка. Есть идеи? – Naor

+2

@Naor флэш-сообщения хранятся в сеансе пользователей, возможно, ваш сеанс истекает слишком скоро? Хорошим способом отладки Passport является использование настраиваемого обратного вызова, как описано [на этой странице] (http://passportjs.org/guide/authenticate/) (поиск «Пользовательский обратный вызов») – robertklep

0

я испытал много много проблем и вопросов, клопов и конфигурации во время работы с паспортом. Мое решение состояло в том, чтобы перейти к Everyauth.

+0

слишком плохо, я использовал паспорт для нескольких проектов, и он всегда работал отлично для меня :) – robertklep

+0

@robertklep: Вы использовали его с facebook? У меня нет высоких требований, только простой логин, и он провалился более одного раза. – Naor

+0

не Facebook, но я хорошо использовал стратегии Google и Local. Я должен признать, что вам нужно «получить» паспорт, прежде чем все будет иметь смысл, а «everyauth» выглядит очень зрелым :) – robertklep

0

Я не знаю, будет ли это использовать для вас, но я получил доступ к флэш-сообщениям таким образом. Когда вы определяете функцию FacebookStrategy, используйте параметр passReqToCallback.

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

это позволит вам добавить req.flash() в качестве параметра проделанная() как так

возвращение сделано (ложь, пользователь reg.flash ('успех', «Вход в успешном '));

Надежда, что проливает некоторый свет на ситуацию для вас или кто-либо другой в поисках помощи

Смежные вопросы