2016-03-08 140 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 : '' 
相关问题