如何在使用PassportJS for Facebook时区分登录和注册

Cyr*_*ard 7 node.js facebook-javascript-sdk passport.js

我正在尝试在Google Analytics上设置目标以跟踪Sign Ups,因此我设置了一个"谢谢"页面作为我的网址目标.当我的用户使用他们的电子邮件地址注册但是当他们使用Facebook注册/登录时,它很有效.当他们登录时,他们被重定向到感谢页面,因为在使用Passport JS和Node设置Facebook时只有一个url回调.

这是我的代码:

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(id, done) {
  UserActivity.findOne(id,'uid ref', function (err, user) {
    done(err, user);
  });
});


passport.use(new FacebookStrategy({
    clientID: 'XXXXXXXXXXXX',
    clientSecret: 'XXXXXXXXXXXXXXXX',
    callbackURL: "https://www.xxxxxxx.com/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    //console.log(profile);
    User.findOne({ uid: profile.id }, function(err, uInfo) {
      if(err) console.log('Error: '+err);
      else{
        //User exists: we are done
        if(uInfo){
          done(err, uInfo);
        }
        else{
            //User doesn't exist: we create a new one
            var newUser = new User ({
              uid: profile.id,
              email:profile.emails[0].value,
              ref: 'Facebook'
            });
            // Saving it to the database.  
            newUser.save(function (err,uInfo) {
              if (err) console.log ('Error on save!');
              done(err, uInfo);
            });
        }
      }
    })
  }
));

app.get('/auth/facebook', passport.authenticate('facebook',{ scope: 'email' }));
app.get('/auth/facebook/callback', 
  passport.authenticate('facebook', { successRedirect: '/thankyou',
                                      failureRedirect: '/login' }));
Run Code Online (Sandbox Code Playgroud)

如果用户存在,我想重定向到他们的仪表板('/ dashboard),如果他们是新用户,我需要将它们重定向到/ thankyou.知道怎么做到这一点?

非常感谢!

Cyr*_*ard 7

没关系,找到了答案.以下是更新后的代码.注意使用passReqToCallback和req.session.newu

passport.use(new FacebookStrategy(
  {
    clientID: 'XXX',
    clientSecret: 'XXX',
    callbackURL: "https://www.XXX.co/auth/facebook/callback",
    passReqToCallback: true
  },
  function(req, accessToken, refreshToken, profile, done) {
    //console.log(profile);
    User.findOne({ uid: profile.id }, function(err, uInfo) {
      if(err) console.log('Error: '+err);
      else{
        if(uInfo){
          done(err, uInfo);
        }
        else{
            var newUser = new User ({
              uid: profile.id,
              email:profile.emails[0].value,
              ref: 'Facebook'
            });
            // Saving it to the database.  
            newUser.save(function (err,uInfo) {
              if (err) console.log ('Error on save!');
              req.session.newu=true;
              done(err, uInfo);
            });
        }
      }
    })
  }
));

app.get('/auth/facebook', passport.authenticate('facebook',{ scope: 'email' }));
app.get('/auth/facebook/callback',function(req, res, next) {

  passport.authenticate('facebook', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      var redLink = '/dashboard';
      if(req.session.newu)redLink = '/dashboard?newu'
      return res.redirect(redLink);
    });
  })(req, res, next);

});
Run Code Online (Sandbox Code Playgroud)

现有用户将被重定向到/ dashboard,新用户将被重定向到/ dashboard?newu Google Analytics不需要2个不同的网址,只需要一个查询字符串.当我设置url目标时,我选择了url start with/dashboard?newu.

希望这可以帮助