Я использую NodeJs с passportJS в своем приложении, чтобы пользователи могли войти/зарегистрироваться с помощью Facebook. Кажется, он работает нормально, но не уверен, что я все время понимаю, что там происходит. Таким образом, идея состоит в том, что пользователи могут попытаться войти с разных страниц в моем приложении, используя данные Facebook. После того, как Facebook возвращает меня все детали я вхожу их в систему или регистрации нового пользователя, используя то, что вернулся Facebook и после того, как это делается редирект на ту же страницу, но будучи уже вошли в систему Код:.PassportJS с Facebook стратегия, мой код правильный?
var passport = require('passport'),
FacebookStrategy = require('passport-facebook').Strategy;
function setupFBStrategy(req, res, next) {
return function(req, res, next) {
var redirectUrl = req.params.currentPage;
console.log('setupFBStrategy')
passport.use(new FacebookStrategy({
clientID: 'abc',
clientSecret: 'def',
// step 2 ################################
callbackURL: "/auth/facebook/callback?currentPage="+redirectUrl,
passReqToCallback: true,
profileFields: ['first_name', 'last_name', 'photos', 'email']
},
function(req, accessToken, refreshToken, profile, done) {
// step 5 ###########################
// verify callback. Now I have user email inside 'profile' and I authenticate this aginst my database. I use `done(..)` to further instruct my app if the registration/authentication with my system was success or not
}
));
next();
}
}
app.use(passport.initialize());
// step 1 ################################
app.get('/auth/facebook/cp/:currentPage', setupFBStrategy(), passport.authenticate('facebook', { authType: 'rerequest', scope: ['email'] }));
app.get('/auth/facebook/callback',
function(req, res, next) {
console.log(req.query.currentPage)
passport.authenticate('facebook', {
successRedirect: '/'+req.query.currentPage, // redirects when user allowed or logged in with username password
failureRedirect: '/'+req.query.currentPage // takes here when user clicks cancel when asked to give permissions
})(req,res,next);
}
);
passport.serializeUser(function(user, done) {
console.log('serialize='+user)
done(null, {});
});
passport.deserializeUser(function(user, done) {
console.log('deserialize=' + user);
done(null, {});
});
Шаги:
в моем приложении пользователь нажимает кнопку «Войти/зарегистрироваться Facebook», что делает запрос на
auth/facebook/cp
маршрут.Расчет маршрута
setUpFBStrategy
. Я добавляю, что пользователь текущей страницы смотрит на callbackUrl.PassportJS отправляет перенаправление обратно в браузер пользователя, а браузер пользователя перенаправляет на facebook для аутентификации.
, когда facebook завершает аутентификацию пользователя, он отправляет перенаправление на браузер пользователя, поэтому браузер перенаправляет на callbackURL с URL-адресом, указанным на шаге 2. Он также добавляет querystring
?code=
к обратному URL-адресу. Является ли эта версия хеширования версией того, что Facebook возвращает, так что в моем случае общественная информация и электронная почта?Теперь выполняется мой сервер «
auth/facebook/callback
» и выполняется проверка обратного вызова. В зависимости от того, звоню ли яdone(null,profile)
и т. Д. Внутри проверить сервер обратного вызоваперенаправить на браузер и переадресацию браузера на'successRedirect
илиfailureRedirect
successRedirect
' или 'failureRedirect
' маршруты.
Все, кажется, работает до сих пор, но верно ли мое понимание? Is 'code
' querystring хешированная версия деталей facebook возвращается? Почему мне даже нужны serializeUser
и deserializeUser
функции в моем коде? Когда я буду использовать refreshToken
и accessToken
?