2013-11-27 5 views
4

Я использую PassportJS для обработки аутентификации FB для браузеров и мобильных клиентов. Для веб-пользователей я использую Passport FacebookStrategy, и это работает по назначению. Я также хотел бы разрешить мобильным клиентам получать доступ к моему API. Я пытаюсь использовать Passport FacebookTokenStrategy, чтобы облегчить это. Кажется, это работает с одной небольшой проблемой. Когда мобильный клиент делает запрос GET на сервер, используется функция FacebookTokenStrategy и активируется функция проверки обратного вызова. В функции проверки я вижу, что пользовательский профиль доступен, и поэтому аутентификация прошла успешно. Однако статус HTTP 404 отправляется обратно в ответ на мобильный клиент. Я не уверен, как правильно настроить это. Это то, что я пытаюсь в настоящее время:PassportJS - FacebookTokenStrategy возвращает 404

// Web based auth 
passport.use(new FacebookStrategy({ 
    clientID: Config.facebook.clientID, 
    clientSecret: Config.facebook.clientSecret, 
    callbackURL: "http://localhost/auth/facebook/callback" 
}, 
function(accessToken, refreshToken, profile, done) { 
User.findOrCreate(profile, function(err, user){ 
    done(err, user); 
}); 
} 
)); 

// Mobile client auth 
passport.use(new FacebookTokenStrategy({ 
    clientID: Config.facebook.clientID, 
    clientSecret: Config.facebook.clientID 
}, 
function(accessToken, refreshToken, profile, done) { 
    console.log(profile); 
    User.findOrCreate(profile, function(err, user){ 
    done(err, user); 
    }); 
} 
)); 

// Redirect the user to Facebook for authentication. When complete, 
// Facebook will redirect the user back to the application at 
//  /auth/facebook/callback 
exports.fb_auth = passport.authenticate('facebook',{ scope: 'email' }); 
// Facebook will redirect the user to this URL after approval. Finish the 
// authentication process by attempting to obtain an access token. If 
// access was granted, the user will be logged in. Otherwise, 
// authentication has failed. 
exports.fb_callback = passport.authenticate('facebook', { successRedirect: '/', 
    failureRedirect: '/login' }); 
// Mobile Authentication 
exports.mobile_fb_auth = passport.authenticate('facebook-token'); 

Должен ли я предоставлять passport.authenticate ('facebook-маркер'); с некоторым дополнительным обратным вызовом «onsuccess»? Это имеет смысл в контексте веб-клиента, но я не уверен, как это следует обрабатывать с помощью стратегии facebook-token.

+0

Привет. Вы получили причину 404 вопроса. Я столкнулся с тем же вопросом – shanks

+0

Привет, У меня были похожие проблемы. Прежде всего, я вижу, что вы используете Config.facebook.clientID как clientID, так и clientSecret. Может, это может быть? Вы реализовали метод User.findOrCreate? Вы выполнили паспорт.serializeUser и passport.deserializeUser после app.use (passport.initialize())? – jonasonline

+0

btw ... Я могу порекомендовать редактор [Brackets] (http://brackets.io), если вы его не попробовали. Он имеет отличный отладчик для узла под названием [Тесей] (https://github.com/adobe-research/theseus). Странно, что вы получите 404 тысячи ... Было бы более полезно, если бы это было 401 или 500 ... – jonasonline

ответ

0

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

Третья функция не вызывается всегда. Это называется только тогда, когда предыдущее промежуточное программное обеспечение преуспевает.

apiRouter.get('/auth/facebook', 
    // authenticate with facebook-token. 
    passport.authenticate('facebook-token'), 

    // if the user didn't successfully authenticate with the above line, 
    // the below function won't be called 
    function(req, res){ 
     res.send(200); 
    }); 

`

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