2016-03-08 65 views
1

我有一個sails應用程序。我正在嘗試實施Facebook登錄。當我點擊與Facebook按鈕,我收到此錯誤登錄:{[FacebookTokenError:此授權碼已被使用。]

error: A server error occurred in a request: 

error: FacebookTokenError: This authorization code has been used. 

完整的錯誤日誌是這樣的:

error: A server error occurred in a request: 
error: FacebookTokenError: This authorization code has been used. 
at Strategy.parseErrorResponse (/home/node_modules/passport-facebook/lib/strategy.js:198:12) 
at Strategy.OAuth2Strategy._createOAuthError (/home/node_modules/passport-facebook/node_modules/passport-oauth2/lib/strategy.js:341:16) 
at /home/node_modules/passport-facebook/node_modules/passport-oauth2/lib/strategy.js:166:45 
at /home/node_modules/passport-facebook/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:177:18 
at passBackControl (/home/node_modules/passport-facebook/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:123:9) 
at IncomingMessage.<anonymous> (/home/node_modules/passport-facebook/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:143:7) 
at IncomingMessage.emit (events.js:117:20) 
at _stream_readable.js:944:16 
at process._tickDomainCallback (node.js:492:13) { [FacebookTokenError: This authorization code has been used.] 
    name: 'FacebookTokenError', 
    message: 'This authorization code has been used.', 
    type: 'OAuthException', 
    code: 100, 
    subcode: undefined, 
    status: 500 } 

中間件代碼如下所示:

var passport = require('passport') 
, FacebookStrategy = require('passport-facebook').Strategy 
, moment= require('moment') 
, momentTimeZone=require('moment-timezone') 
, inflection = require('inflection') 
, markdown = require('markdown').markdown 
, URL =require('url') 
, LocalStrategy=require('passport-local').Strategy 
, config= require('./local') 
, device = require('express-device') 


var createUser = function (token, tokenSecret, profile, done) { 
process.nextTick(function() { 
    User.findOne({ 
      or: [ 
       {uid: parseInt(profile.id)}, 
       {uid: profile.id} 
      ] 
     } 
    ).exec(function (err, user) { 
      if (user) { 
       return done(null, user); 
      } else { 

       var data = { 
        provider: profile.provider, 
        uid: profile.id, 
        name: profile.displayName, 
        email: profile.email 
       }; 

       if(profile.emails && profile.emails[0] && profile.emails[0].value) { 
        data.email = profile.emails[0].value; 
       } 
       if(profile.name && profile.name.givenName) { 
        data.firstname = profile.name.givenName; 
       } 
       if(profile.name && profile.name.familyName) { 
        data.lastname = profile.name.familyName; 
       } 
       User.create(data).exec(function (err, user) { 
        sails.log.info("Error",JSON.stringify(err)) 
        return done(err, user); 
       }); 
      } 
     }); 
}); 
}; 
module.exports = { 
passport.use(new FacebookStrategy({ 
       clientID: config.facebook.clientID, 
       clientSecret: config.facebook.clientSecret, 
       callbackURL: config.facebook.callbackURL, 
       profileFields: ['name', 'emails' ], 
       enableProof: true 
      }, 
     function (accessToken, refreshToken, email, done) 
     { 
      //console.log("Auth done"); 
      //done(null, email); 
      createUser 
     } 
      //createUser 
     //} 
     )) 

     passport.serializeUser(function(user, done) { 
      done(null, user); 
     }); 
     passport.deserializeUser(function(obj, done) { 
      done(null, obj); 
}); 


     /*app.get("/auth/facebook", passport.authenticate("facebook", { scope: ['email', 'public_profile'] }));*/ 
     app.get('/auth/facebook', 
     passport.authenticate('facebook', { scope: ['email', 'public_profile'] })); 

     app.get("/auth/facebook/callback", 
      passport.authenticate("facebook", { 
       successRedirect: "/", 
       failureRedirect: "/login" 
      }), 
      function(req, res) { 
       res.redirect('/'); 
      }); 
      app.get('/logout', function(req, res){ 
      req.logout(); 
      res.redirect('/'); 
      }); 
      function ensureAuthenticated(req, res, next) { 
       if (req.isAuthenticated()) { return next(); } 
        res.redirect('/login') 
       } 

app.use(passport.initialize()); 
     app.use(passport.session()); 
     app.use(device.capture()); 
     device.enableDeviceHelpers(app) 
    } 
} 

}; 

燦任何人都會建議我爲什麼會收到此錯誤和任何可能的解

回答

2

當您使用facebook登錄進行登錄時發生此錯誤,之後刪除數據庫中的用戶記錄。您必須在您的Facebook帳戶中刪除您的APP,然後重試。

0

另一個可能性是您已經登錄,並且您的中間件正在嘗試重新登錄。在你的代碼中,你沒有檢查用戶是否已經登錄,然後將請求發送到「auth/facebook」。有一種簡單的方法可以證明這一點:以私人模式打開Chrome窗口,因此不使用cookie,並嘗試再次你的Facebook登錄好運

0

Probabily不存在的文件數據的某些屬性試試!。

console.log(profile) 

爲了驗證文件的所有屬性,在我的情況:

{ id: 'nnnnnnnn', 
    username: undefined, 
    displayName: 'My Name', 
    name: 
    { familyName: undefined, 
    givenName: undefined, 
    middleName: undefined }, 
    gender: undefined, 
    profileUrl: undefined, 
    provider: 'facebook', 
    _raw: '{"name":"My name","id":"nnnnnnnn"}', 
    _json: { name: 'My name', id: 'nnnnnnnn' } } 

不存在任何屬性「電子郵件」或類似的,這會產生錯誤而不完整認證的cicle生活:

error: FacebookTokenError: This authorization code has been used. 

該屬性的電子郵件沒有得到,因爲我隱藏在我的帳戶Facebook的這個。

在您的代碼:

... 
var data = { 
    provider: profile.provider, 
    uid: profile.id, 
    name: profile.displayName, 
    email: profile.email 
}; 
... 

行:

email: profile.email 

您已經假設屬性電子郵件已經存在。

嘗試:

email: (profile.emails && profile.emails[0]) ? profile.emails[0].value : '' 
相關問題