簡體   English   中英

{ [FacebookTokenError:此授權碼已被使用。]

[英]{ [FacebookTokenError: This authorization code has been used.]

我有一個風帆應用程序。 我試圖實現 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)
    }
}

};

誰能建議我為什么會收到此錯誤以及任何可能的解決方案。

當您使用 facebook login 登錄時會發生此錯誤,然后刪除數據庫中的用戶記錄。 您必須在您的 facebook 帳戶中刪除您的 APP,然后再試一次。

另一種可能性是您已經登錄,而您的中間件正在嘗試再次登錄。 在您的代碼中,在向“auth/facebook”發送請求之前,您沒有檢查用戶是否已登錄。有一種簡單的方法可以證明這一點:在隱私模式下打開 Chrome 窗口,因此不使用 cookie,然后嘗試再次登錄你的臉書。祝你好運!

可能不存在配置文件數據的某些屬性。 嘗試:

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

不存在任何屬性“電子郵件”或類似屬性,這會產生錯誤並且無法完成身份驗證的周期:

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 已經存在。

嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM