Попросите пользователя пройти регистрацию после входа в систему через 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
Оставьте в покое конфиги, связанные с паспортом, напишите свои собственные проверки на уровне маршрутизатора, чтобы проверить, зарегистрирован ли зарегистрированный пользователь или нет. Вы можете сделать это, используя следующие шаги:
- Пользователь получает доступ к определенному маршруту, и вы удостоверяетесь, что он / она аутентифицирован
- Вы получаете идентификатор вошедшего в систему пользователя
- Вы проверяете mongodb или mysql или redis или любую другую логику, которую можете реализовать, чтобы решить, завершил ли пользователь с этим идентификатором регистрацию или нет
- Если нет, то вы перенаправляете пользователя на страницу регистрации, если да, то вы позволяете запросу пользователя обрабатываться в обычном режиме.
Чтобы получить идентификатор вошедшего в систему пользователя, вы можете проверить 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 в сочетании с работой с паспортом, и тогда вы получите представление о том, где перехватывать запросы пользователей и какой подход вам подходит.,