2016-02-07 2 views
-1

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

ответ

0

Есть несколько способов добиться того, что вы хотите сделать, и с моей точки зрения возиться с 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 для зарегистрированного пользователя с помощью вошедшего в идентификатор пользователя (twitter id) и проверьте, установлено ли определенное поле. Вы устанавливаете это поле, когда пользователь регистрируется иначе по умолчанию, он может быть ложным.

Метод 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); 
    } 
} 

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

+0

Все эти методы позволяют паспорту аутентифицировать пользователя, а затем зависеть от отдельной логики «завершенного реорганизации». Невозможно ли отсрочить аутентификацию до завершения регистрации? Так выглядит, как работает stackoverflow. –

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