2013-11-27 98 views
4

我使用PassportJS爲瀏覽器和移動客戶端處理FB身份驗證。對於網絡用戶,我使用的是Passport FacebookStrategy,並且按照預期工作。我也想讓移動客戶端訪問我的API。我正在嘗試使用Passport FacebookTokenStrategy來促進此操作。這似乎正在處理一個小問題。當移動客戶端向服務器發出GET請求時,將使用FacebookTokenStrategy並調用驗證回調函數。在驗證功能中,我可以看到用戶配置文件可用,因此驗證成功。但是,對移動客戶端的響應會發回404的HTTP狀態。我不知道如何正確配置它。這就是我想目前: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'回調?這在Web客戶端的上下文中是有道理的,但我不確定如何使用facebook-token策略來處理這個問題。

+0

嗨。你有沒有得到404問題的原因。我面臨同樣的問題 – shanks

+0

嗨, 我有類似的問題。 首先我看到你使用Config.facebook.clientID作爲clientID和clientSecret。錯別字? 您是否實現了User.findOrCreate方法? 你是否在app.use(passport.initialize())之後實現了passport.serializeUser和passport.deserializeUser? – jonasonline

+0

btw ...如果你還沒試過,我可以推薦編輯器[Brackets](http://brackets.io)。它有一個很好的節點調試器[Theseus](https://github.com/adobe-research/theseus)。 奇怪的是,你得到404你...會更有意義,如果它是401或500 ... – jonasonline

回答

0

我剛剛有同樣的問題,並能夠解決它。由於中間件在express中的工作方式,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); 
    }); 

`