Facebook graph api 使用Facebook登录和本地登录的expressjs passport
我正在使用ExpressJS的Passport中间件,但我找不到一种同时使用Passport本地策略和Passport facebook策略的方法。我想设置它,这样一个用户将在我的网站上创建一个帐户,然后,如果他们愿意,他们可以登录到facebook,这样你就可以看到你的朋友谁也在使用该网站。但是,我不知道当返回facebook api数据时,登录的用户是什么 当某人创建帐户时,他们的数据用户名、电子邮件等。。存储在数据库中。当他们登录facebook时,我只想更新数据库和会话,现在包括facebook API facebookID、AccessToken等返回的一些信息。。。如何做到这一点 下面是我可以用来访问返回的facebook数据的代码。但是,只有在数据库条目之前已经与facebook同步的情况下,User.findOne行才有效。我是否可以通过任何方式传递req.session数据来识别当前登录的用户并更新其配置文件Facebook graph api 使用Facebook登录和本地登录的expressjs passport,facebook-graph-api,express,passport.js,passport-facebook,passport-local,Facebook Graph Api,Express,Passport.js,Passport Facebook,Passport Local,我正在使用ExpressJS的Passport中间件,但我找不到一种同时使用Passport本地策略和Passport facebook策略的方法。我想设置它,这样一个用户将在我的网站上创建一个帐户,然后,如果他们愿意,他们可以登录到facebook,这样你就可以看到你的朋友谁也在使用该网站。但是,我不知道当返回facebook api数据时,登录的用户是什么 当某人创建帐户时,他们的数据用户名、电子邮件等。。存储在数据库中。当他们登录facebook时,我只想更新数据库和会话,现在包括face
我不熟悉passport的facebook模块,但我认为您可以通过以下方式访问您的本地用户数据库:
function(accessToken, refreshToken, profile, done) {
User.findOne({facebookID: profile.id}, function(err, user) {
if (err) { return done(err); }
user.facebookID = profile.id;
user.facebookToken = accessToken;
user.save();
return done(null, user);
});
像这样的事情应该没问题:
var User = require('./models/user');
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
function(accessToken, refreshToken, profile, done) {
//Make sure you have your user's email field and match that with
//the email field you got from Facebook
User.findOne({email: profile.email}, function(err, user) {
if (err) { return done(err); }
user.facebookID = profile.id;
user.facebookToken = accessToken;
user.save();
return done(null, user);
});
我不确定配置文件是否有电子邮件字段,但我认为应该在配置文件中的某个位置
但是,我明白,如果您的用户只有用户名和密码,这将不起作用。要获取当前登录的用户,您需要将passReqToCallback:true选项添加到facebookStrategy中
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "http://localhost:3000/auth/facebook/callback",
//callbackURL: "http://localhost:3000"
profileFields: ['id', 'displayName'],
passReqToCallback : true // NEED THIS!!
},
function(req, accessToken, refreshToken, profile, done) {
if (req.user) {
User.findOne({username: req.user.username}, function(err, user) {
if (err) { return done(err); }
user.facebookID = profile.id;
user.facebookToken = accessToken;
user.save();
return done(null, user);
});
}
else{
console.log("attempted facebook auth from non-logged in user");
return done(null, null);
}
}
));
谢谢你的回复!本地用户确实有一封电子邮件,但无法确保用户输入的电子邮件与他们的facebook电子邮件相同。也许您可以尝试将配置文件传递到“完成”,然后使用“完成”方法呈现带有facebookID、电子邮件、,等等。然后您可以使用会话数据并插入数据库。当我尝试此操作时,会话数据也会替换为json配置文件。所以我没有以前会话数据的记录
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "http://localhost:3000/auth/facebook/callback",
//callbackURL: "http://localhost:3000"
profileFields: ['id', 'displayName'],
passReqToCallback : true // NEED THIS!!
},
function(req, accessToken, refreshToken, profile, done) {
if (req.user) {
User.findOne({username: req.user.username}, function(err, user) {
if (err) { return done(err); }
user.facebookID = profile.id;
user.facebookToken = accessToken;
user.save();
return done(null, user);
});
}
else{
console.log("attempted facebook auth from non-logged in user");
return done(null, null);
}
}
));