node.js - 使用 PassportJS for Facebook 时如何区分登录和注册

标签 node.js facebook-javascript-sdk passport.js

我正在尝试在 Google Analytics 上设置目标以跟踪注册,因此我设置了一个“谢谢”页面作为我的 url 目标。当我的用户使用他们的电子邮件地址注册时效果很好,但当他们使用 facebook 注册/登录时效果不佳。当他们登录时,他们会被重定向到感谢页面,因为在使用 Passport JS 和 Node.js 设置 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' }));

如果用户存在,我想重定向到他们的仪表板 ('/dashboard),如果他们是新用户,我需要将他们重定向到/thankyou。 知道如何实现这一点吗?

非常感谢!

最佳答案

没关系,找到答案了。这是下面更新的代码。注意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);

});

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

希望对你有帮助

关于node.js - 使用 PassportJS for Facebook 时如何区分登录和注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20897967/

相关文章:

javascript - 通过名称获取嵌套对象属性的更优雅的方法?

Node.js 每个用户一个 session

javascript - fb-video 在运行时更改 url 并重新加载播放器(无需页面刷新)

node.js - mongoose.connect 连接到 mongodb 后不调用回调

node.js - nodejs - fs.stat isFile() 在作为守护进程/服务从 systemd 执行时总是返回 true

ios - Facebook 广告 -> 多个广告集的转化跟踪

javascript - JS Facebook登录iOS8

node.js - 保存用户的收藏夹

javascript - 使用 react-router 并通过 Passport.js 进行身份验证 - 可能吗?

javascript - Joi.js 表单验证 - 以 json 形式返回消息