{

我有一个帆应用程序。 我正在尝试实施Facebooklogin。 当我点击loginFacebook的button,我得到这个错误:

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

任何人都可以build议为什么我得到这个错误和任何可能的解决scheme

当您使用Facebooklogin进行login时发生此错误,之后删除数据库中的用户logging。 您必须在您的Facebook帐户中删除您的APP,然后重试。

另一个可能性是你已经login了,你的中间件正在尝试再次login。 在你的代码中,你没有检查用户是否已经login,然后把请求发送到“auth / facebook”。有一个简单的方法来certificate这一点:以私人模式打开Chrome窗口,所以不使用cookie,再次您的Facebooklogin。祝您好运!

Probabily不存在configuration文件数据的一些属性。 尝试:

 console.log(profile) 

validationconfiguration文件的所有属性。 在我的情况下:

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

不存在任何属性“电子邮件”或类似的,这会产生错误,并不完成validationcicle生活:

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