Facebook graph api 使用Facebook登录和本地登录的expressjs passport

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

我正在使用ExpressJS的Passport中间件,但我找不到一种同时使用Passport本地策略和Passport facebook策略的方法。我想设置它,这样一个用户将在我的网站上创建一个帐户,然后,如果他们愿意,他们可以登录到facebook,这样你就可以看到你的朋友谁也在使用该网站。但是,我不知道当返回facebook api数据时,登录的用户是什么

当某人创建帐户时,他们的数据用户名、电子邮件等。。存储在数据库中。当他们登录facebook时,我只想更新数据库和会话,现在包括facebook API facebookID、AccessToken等返回的一些信息。。。如何做到这一点

下面是我可以用来访问返回的facebook数据的代码。但是,只有在数据库条目之前已经与facebook同步的情况下,User.findOne行才有效。我是否可以通过任何方式传递req.session数据来识别当前登录的用户并更新其配置文件


我不熟悉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);    
    }
  }
));