2015-10-20 112 views
1

我已經創建了一個Facebook應用程序,只有我使用。現在我已經成功了,但除了我以外沒有其他人能夠登錄。nodejs護照 - 臉書認證

他們得到以下錯誤。

FacebookTokenError: This authorization code has been used. 
at Strategy.parseErrorResponse (/var/www/html/project/node_modules/passport-facebook/lib/strategy.js:199:12) 
at Strategy.OAuth2Strategy._createOAuthError (/var/www/html/project/node_modules/passport-facebook/node_modules/passport-oauth2/lib/strategy.js:345:16) 
at /var/www/html/project/node_modules/passport-facebook/node_modules/passport-oauth2/lib/strategy.js:171:43 
at /var/www/html/project/node_modules/passport-facebook/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:177:18 
at passBackControl (/var/www/html/project/node_modules/passport-facebook/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:123:9) 
at IncomingMessage.<anonymous> (/var/www/html/project/node_modules/passport-facebook/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:143:7) 
at IncomingMessage.EventEmitter.emit (events.js:117:20) 
at _stream_readable.js:920:16 
at process._tickCallback (node.js:415:13) 

這裏有什麼問題。應用程序是活的。

回答

0

我偶然發現這個線程:https://github.com/jaredhanson/passport-facebook/issues/93

普遍的共識似乎是,jdomingo's solution工作的人。他的解決方案包括在策略使enableProof

passport.use(new FacebookStrategy({ 
clientID: ---, 
clientSecret: ---, 
callbackURL: "http://---/auth/facebook/callback", 
enableProof: true 
} 

jdomingo提供了一些further explanation爲什麼這會有所幫助。 FWIW,我沒有親自嘗試過。

+0

沒有幫助..... –

0

看起來,你是不是唯一的一個:

here

他們提供了多種解決方案。

無論如何 - 如果你真的想要一個解決方案,你將不得不在這裏粘貼你的代碼。

+0

沒有幫助..... –

1

我在Express中有一個REST api,它使用來自Jeroen Pelgrims的信息使用Sessionless Facebook登錄。它所做的是:

與Facebook戰略 保存令牌和用戶數據庫信息 登錄使用該令牌用於承載登錄 什麼護照Facebook的身份驗證回調頁使用是這樣的: passport.authenticate(「戰略',options,user,error)

該行爲正確地拋出該錯誤!作爲@jsilveira在評論中說,發生錯誤,如果在兩次用戶登錄...

我的答案很簡單,我趕上了錯誤...閱讀是有,但...

//爲Facebook驗證路徑和登錄

router.get('/auth/facebook', 
     passport.authenticate('facebook', {session: false, scope : ['email'] }) 
    ); 

// handle the callback after facebook has authenticated the user 
router.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { session: false, failureRedirect : '/'}), 

    // on succes 
    function(req,res) { 
     // return the token or you would wish otherwise give eg. a succes message 
     res.render('json', {data: JSON.stringify(req.user.access_token)}); 
    }, 

    // on error; likely to be something FacebookTokenError token invalid or already used token, 
    // these errors occur when the user logs in twice with the same token 
    function(err,req,res,next) { 
     // You could put your own behavior in here, fx: you could force auth again... 
     // res.redirect('/auth/facebook/'); 
     if(err) { 
      res.status(400); 
      res.render('error', {message: err.message}); 
     } 
    } 
); 

但是,如果你們希望它只是登錄/授權再次,你可以插入一個回調或在錯誤的部分重定向。

希望這可以澄清你們遇到的一些問題。如果你有任何問題或要求,不要害羞。信息在我的個人資料上。

PS:stackoverflow.com有重新授權它遵循這樣一個答案:

app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
     if (err) { 
     return next(err); // will generate a 500 error 
     } 
     // Generate a JSON response reflecting authentication status 
     if (! user) { 
     return res.send({ success : false, message : 'authentication failed' }); 
    } 
    return res.send({ success : true, message : 'authentication succeeded' }); 
    })(req, res, next); 
}); 
1

你需要調用完成()你FacebookStrategy回調裏面。爲了測試,你可以只是做

function(accessToken, refreshToken, profile, done) { 
console.log("Auth done"); 
done(null, profile); 
} 

您可以參考這裏:https://github.com/jaredhanson/passport/issues/108