Попросите пользователя пройти регистрацию после входа в систему через Passport

Интересно, что является лучшей практикой, чтобы попросить пользователя для получения дополнительной информации для завершения регистрации после входа в систему с помощью Passport. В настоящее время я могу успешно войти в систему через Twitter, и мой маршрут обратного вызова '/auth/twitter/callback' успешно вызван. Тем не менее, на данный момент я представляю форму, чтобы попросить у них еще несколько частей информации. Моя проблема в том, что на этом этапе req.IsAuthenticated() уже возвращает true, в то время как я бы предпочел установить IsAuthenticated вручную только после того, как они завершат регистрацию, а не только после вызова обратного вызова Twitter. Какие-либо предложения?

1 ответ

Есть несколько способов добиться того, что вы хотите сделать, и, с моей точки зрения, возиться с req.isAuthenticated() не самый лучший Я рекомендую следующие подходы.

Способ 1

В дополнение к req.isAuthenticated() поставить новое условие, чтобы проверить, завершил ли пользователь регистрацию или нет, т.е. user.completedRegistration() где completedRegistration() это функция, которая проверяет либо mongodb, либо какую-либо другую логику, чтобы решить, да или нет. Пример как следовать:

var isAuthenticated = function (req, res, next) {
  if (req.isAuthenticated() && user.completedRegistration()) {
    //user is both authenticated registered.
    return next();
  } else if (req.isAuthenticated() && !user.completedRegistration()) {
    //user is only authenticated, need to fill the form.
    res.redirect('/to/the/view/that/have/registration/form'); 
  } else {
    // user needs to login
    res.redirect('/map/to/the/login/route/handler');
  }
}

Очевидно, вы будете использовать isAuthenticated в ваших маршрутах, как показано ниже:

// secure GET route
  router.get('/secure/api/create', isAuthenticated, function(req, res) {
    //return some secure view
  }); 

user.completedRegistration() это может быть функция, которая запрашивает mongodb для вошедшего в систему пользователя с использованием идентификатора вошедшего в систему пользователя (твиттер-идентификатор) и проверяет, установлено ли определенное поле. Вы устанавливаете это поле, когда пользователь регистрируется, иначе по умолчанию оно может быть ложным.

Способ 2

В зависимости от порядка ваших конфигов в app.js каждый запрос запускает deserializeUser, как показано ниже:

passport.deserializeUser(function(id, done) {
   User.findById(id, function(err, user) {
      console.log('deserializing user:',user);
         done(err, user);
      });
 });

Который берет идентификатор пользователя, вошедшего в систему, из объекта req, получает пользователя из mongodb и заполняет дополнительную информацию о пользователе в объекте req. Вы можете настроить этот метод User.find используя не только идентификатор пользователя, но и поле, которое показывает, зарегистрирован ли пользователь или нет. Очевидно, вам нужно установить поле в пользовательском объекте mongodb и User модель.

Способ 3

Оставьте в покое конфиги, связанные с паспортом, напишите свои собственные проверки на уровне маршрутизатора, чтобы проверить, зарегистрирован ли зарегистрированный пользователь или нет. Вы можете сделать это, используя следующие шаги:

  1. Пользователь получает доступ к определенному маршруту, и вы удостоверяетесь, что он / она аутентифицирован
  2. Вы получаете идентификатор вошедшего в систему пользователя
  3. Вы проверяете mongodb или mysql или redis или любую другую логику, которую можете реализовать, чтобы решить, завершил ли пользователь с этим идентификатором регистрацию или нет
  4. Если нет, то вы перенаправляете пользователя на страницу регистрации, если да, то вы позволяете запросу пользователя обрабатываться в обычном режиме.

Чтобы получить идентификатор вошедшего в систему пользователя, вы можете проверить req.user поле. Как показано в следующей функции, я реализовал twitter, facebook а также local и, следовательно, все мои чеки.

function getCurrentLoggedInUserId(req, callback) {
  console.log('FUNC getCurrentLoggedInUserId');

  var userId = "ghost";
  if(req.user) {
    if(req.user.local != undefined && req.user.local.email != undefined) {
      userId = req.user.local.email;
    } else if(req.user.fb != undefined && req.user.fb.id != undefined) {
      userId = req.user.fb.id;
    } else if(req.user.twitter != undefined && req.user.twitter.id != undefined) {
      userId = req.user.twitter.id;
    }
    callback(null, userId);
  } else {
    callback(null, userId);
  }
}

Здесь есть много других способов добиться того, о чем вы просили, но вам нужно немного почитать в приложении Express в сочетании с работой с паспортом, и тогда вы получите представление о том, где перехватывать запросы пользователей и какой подход вам подходит.,

Другие вопросы по тегам