【问题标题】:{ [FacebookTokenError: This authorization code has been used.]{ [FacebookTokenError: 此授权码已被使用。]
【发布时间】:2016-06-22 21:13:49
【问题描述】:

我有一个风帆应用程序。我试图实现 Facebook 登录。当我单击使用 facebook 登录按钮时,我收到此错误:

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)
    }
}

};

谁能建议我为什么会收到此错误以及任何可能的解决方案。

【问题讨论】:

    标签: javascript node.js facebook sails.js passport-facebook


    【解决方案1】:

    当您使用 facebook 登录时会发生此错误,然后删除数据库中的用户记录。您必须在您的facebook帐户中删除您的APP,然后重试。

    【讨论】:

      【解决方案2】:

      另一种可能性是您已经登录,而您的中间件正在尝试再次登录。在您的代码中,在将请求发送到“auth/facebook”之前,您没有检查用户是否已经登录。有一种简单的方法可以证明这一点:以私有模式打开 Chrome 窗口,因此不使用 cookie,然后尝试再次登录您的 Facebook。祝您好运!

      【讨论】:

      • 这发生在我身上。如何解决此类问题?
      【解决方案3】:

      配置文件数据的某些属性可能不存在。试试:

      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' } }
      

      不存在任何属性“email”或类似的,这会产生错误并且不会完成验证的cicle生命:

      error: FacebookTokenError: This authorization code has been used.
      

      属性 email 未获取,因为我将其隐藏在我的 Facebook 帐户中。

      在您的代码中:

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

      行:

      email: profile.email
      

      您已经假设属性 email 已经存在。

      试试:

      email: (profile.emails && profile.emails[0]) ? profile.emails[0].value : ''
      

      【讨论】:

        猜你喜欢
        • 2016-06-21
        • 2016-03-05
        • 2014-01-06
        • 2012-11-25
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 2023-03-26
        • 2018-10-02
        相关资源
        最近更新 更多