2014-01-03 2 views
6

Я пытаюсь настроить цели в Google Analytics, чтобы отслеживать оповещения, поэтому я установил страницу «спасибо» как цель моего URL. Он работает хорошо, когда мои пользователи регистрируются с их адресом электронной почты, но не когда они используют facebook для регистрации/входа в систему. Когда они заходят в систему, они перенаправляются на страницу благодарности, поскольку при настройке Facebook используется только один обратный вызов URL, используя Passport JS и Node.Как отличить Логин от Зарегистрироваться при использовании PassportJS для Facebook

Вот мой код:

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' })); 

Если пользователь существует, то я хотел бы перенаправить на их приборной панели ('/ приборной панели), и если они являются новыми пользователями, мне нужно перенаправить их к/большое спасибо. Любая идея, как этого достичь?

Большое спасибо!

+0

Если пользователь не существует 'NEWUSER = новый пользователь ({isNewUser: истинно, ...});' и если пользователь существует, мы можем 'uInfo.isNewUser = ложь; done (err, uInfo) ', проверить isNewUser на маршруте позже. – damphat

+0

Спасибо, но я не хотел использовать это, потому что у меня не было прямого доступа к новому пользовательскому объекту в обратном вызове. Я мог бы прочитать базу данных, но мне нужно было бы прочитать и обновить флаг. 2 вызова DB слишком много всего –

ответ

6

Nevermind, нашел ответ. Ниже приведен обновленный код. Обратите внимание на использование 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); 

}); 

Существующий пользователь будет перенаправлен/приборную панель и новый пользователь будет перенаправлен/приборную панель? NEWU Google Analytics не нужно 2 разных urls, ему просто нужна строка запроса. Когда я настраиваю URL-адрес, я выбрал url start с/dashboard? Newu.

Надеется, что это помогает

+0

Полезно знать 'passReqToCallback' :) Но разве вам не нужно очищать session.newu? – damphat

+0

Спасибо, что заметили, но я действительно не делаю, очистка session.newu выполняется, когда пользователь выходит из системы –

Смежные вопросы