{
我有一个帆应用程序。 我正在尝试实施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 : ''
- 护照jwtvalidationcallback没有被调用
- 在Node.js上使用passport-ldapauth进行LDAPauthentication
- 如何在没有会话的Facebook Passport之后redirect到之前的URL
- 从模型传递JSON到路由不起作用
- Node.js,express,护照authentication“Bad Request”
- 诺言创build,但不是从返回。 Knex / Bookshelf
- 如何使用Node和Passportvalidation非空字段?
- 会话不能正确地从存储中获得,使用express-session和passportjs
- 错误:401(未授权),Passport身份validation在节点中