我现在一直试图解决这个问题,但我无法找到错误。我已经在客户端使用JavaScript了一段时间,并开始编写一本书。不幸的是,facebook似乎已经改变了他们的oauth方法(例如用户名似乎已被弃用)。所以我的问题是这个。如果我还没有登录到Facebook,我会被重定向到fb。我登录,但卡在其网站上。 但是,如果我被锁定,我的浏览器只会继续加载一两分钟,然后告诉我已经使用了auth密钥。我希望也许你可以帮助我。我的环境文件看起来像这样
(development.js)
module.exports = {
//Development configuration options
db : 'mongodb://localhost/mean-book',
sessionSecret : 'developmentSessionSecret',
facebook : {
clientId : '*************',
clientSecret : '************************',
callbackURL : 'http://localhost:3000/oauth/facebook/callback'
}
};
在developers.facebook页面上,我已将我的应用程序域设置为localhost,并将站点URL设置为http://localhost:3000/oauth/facebook/callback。我在那里尝试了很多变化。迄今没有任何帮助。这就是我的策略
facebook.js
var passport = require('passport'),
url = require('url'),
FacebookStrategy = require('passport-facebook').Strategy,
config = require('../config'),
users = require('../../app/controllers/users.server.controller');
module.exports = function(){
passport.use(new FacebookStrategy({
clientID : config.facebook.clientId,
clientSecret : config.facebook.clientSecret,
callbackURL : config.facebook.callbackURL,
profileFields : ['id','email', 'name', 'displayName', 'gender', 'profileUrl'],
passReqToCallback : true
},
function(req, accessToken, refreshToken, profile, done){
var providerData = profile._json;
providerData.accessToken = accessToken;
providerData.refreshToken = refreshToken;
console.log('------PROFILE-----');
console.log(profile);
console.log('------END PROFILE-------')
var providerUserProfile = {
firstName : profile.name.givenName,
lastName : profile.name.familyName,
fullName : profile.displayName,
username : profile.id,
email : profile.emails[0].value,
provider : 'facebook',
providerId : profile.id,
providerData: providerData
};
console.log('---------------');
console.log(providerUserProfile);
console.log('---------------')
users.saveOAuthUserProfile(req, providerUserProfile, done);
}));
};
我的护照配置看起来像这样
(passport.js)
var passport = require('passport'),
mongoose = require('mongoose');
module.exports = function(){
var User = mongoose.model('User');
passport.serializeUser(function(user, done){
done(null, user.id);
});
passport.deserializeUser(function(id, done){
User.findOne({
_id: id
}, '-password -salt', function(err, user){
done(err, user);
});
});
require('./strategies/local.js')();
require('./strategies/facebook.js')();
};
最后我的路线使用这种方法
exports.saveOAuthUserProfile = function(req, profile, done){
User.findOne({
provider : profile.provider,
providerId : profile.providerId
}, function(err, user){
if(err){
return done(err);
} else {
if(!user){
var possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : '');
}
}
});
}
首先感谢您通过所有这些代码来帮助。我真的很感激,因为我很失落。再次感谢,
问候克里斯
答案 0 :(得分:0)
如果fb用户成功授权,您错过了致电done
的功能
exports.saveOAuthUserProfile = function(req, profile, done){
User.findOne({
provider : profile.provider,
providerId : profile.providerId
}, function(err, user){
if(err){
return done(err);
} else {
if(!user){
user.possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : '');
}
done(null, user);
}
});
}