Обрабатывать невыбранные значения из Facebook через PassportJS

Я использую PassportJS и Facebook-стратегию для аутентификации пользователей на моем сайте.

Все хорошо, когда пользователь ничего не отменяет во всплывающем окне 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);
    });
);
}

Я могу, конечно, сделать какой-то препроцессор, но я не знаю, что мне нужно делать, если данные недействительны. Например, сказать "Электронная почта" является обязательным. Как я скажу пользователю: «Поскольку вы не предоставили обязательное поле электронной почты, пожалуйста, заполните его», а затем я переведу пользователя на страницу настроек профиля.

Мой URL-адрес обратного вызова в приложении Facebook:

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

И это маршрут NodeJS ниже:

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

Любой ввод поможет.

Заранее спасибо.


person Shayan Khan    schedule 26.08.2017    source источник


Ответы (1)


Я думаю, что здесь пользователь не отменит выбор поля электронной почты. 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 для успешного перенаправления и неудачного перенаправления.

person Gousia    schedule 26.08.2017
comment
В яблочко. Мой вопрос: как мне перенаправить пользователя на эту определенную страницу с формой? Я вижу только successRedirect и failureRedirect. Спасибо - person Shayan Khan; 26.08.2017
comment
Привет помошник. Я думаю, что я мог быть не ясен. То, что я вижу выше, - это то, как проверить, предоставлены ли переменные или нет. Я не понимаю, как будет работать редирект. Я выполнял проверку данных по всему сайту, но я не знаю, как я могу направить пользователя на определенные страницы на основе предоставленных данных. Надеюсь, теперь я ясно выразился. Спасибо - person Shayan Khan; 29.08.2017