通过PassportJS处理来自Facebook的取消选择的值

时间:2017-08-26 10:08:37

标签: node.js passport.js passport-facebook

我正在使用PassportJS和Facebook-Strategy来验证我网站的用户。

当用户未在Facebook弹出窗口中取消选择任何内容时,一切都很顺利。

然而,假设用户取消选择电子邮件,我将不会得到回复,这显然是在用户的控制之下。

我的问题是 - 如何根据我重试的数据将它们引导到“其他地方”?

passport.use(new FacebookStrategy({
clientID: config.facebook.appID,
clientSecret: config.facebook.appSecret,
callbackURL: config.facebook.callbackURL,
profileFields: ['displayName', 'picture.type(large)', 'emails', 'birthday', 'location']},
function(accessToken, refreshToken, profile, done){

    var newUser = new userModel({
        fullname    :   profile.displayName,
        profilePic  :   profile.photos[0].value || '',
        email       :   profile.emails[0].value || '',
        birthday    :   profile._json.birthday || '',
        location    :   profile._json.location.name || '',
    });

    newUser.save(function(err){
        done(null, newUser);
    });
);
}

当然,我可以做某种预处理器,但如果数据无效,我不知道我需要做什么。例如,说“电子邮件”是必须的。我如何告诉用户:“由于您没有提供强制性电子邮件字段,请填写”然后我将用户带到“配置文件设置”页面。

我在Facebook应用上的回调网址是:

http://localhost:3000/auth/facebook/callback

下面是NodeJS路线:

router.get('/auth/facebook/callback', passport.authenticate('facebook', {
    successRedirect:'/wall',
    failureRedirect:'/login'
}));

任何输入都会有所帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为用户不会取消选择电子邮件字段。 Facebook将为您提供您请求的所有用户数据。但是,如果Facebook中提供的用户电子邮件未经过验证,那么您将无法获得该信息  email:profile.emails[0].value此处,即电子邮件字段将为空。如果您认为该电子邮件是强制性的,那么在每次成功登录后,只需编写代码以检查电子邮件字段是否为空/空。如果它是空的,那么您创建一个表单,您可以要求用户输入他们的电子邮件。  我使用mongodb,护照代码就是这样,

var User = require('../models/user');
    passport.use(new FacebookStrategy({
        clientID: configAuth.facebookAuth.clientID,
        clientSecret: configAuth.facebookAuth.clientSecret,
        callbackURL: configAuth.facebookAuth.callbackURL,
        profileFields: ['id', 'email', 'first_name', 'last_name'],
      },
      function(token, refreshToken, profile, done) {
        process.nextTick(function() {
          User.findOne({ 'facebook.id': profile.id }, function(err, user) {
            if (err)
              return done(err);
            if (user) {
              return done(null, user);
            } else {
              var newUser = new User();
              newUser.facebook.id = profile.id;
              newUser.facebook.token = token;
              newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
              if(profile.emails !=null)
    {
              newUser.facebook.email = (profile.emails[0].value || '').toLowerCase();
    }
    else
    {
    //write your code here to use the form and request the email from the user and then add that email to your database.
    }
              newUser.save(function(err) {
                if (err)
                  console.log(err);
                return done(null, newUser);
              });
            }
          });
        });
      }));

现在,您不需要更改成功重定向和失败重定向的nodejs路由。