2016-05-06 2 views
1

Я использую 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, {}); 
}); 

Шаги:

  1. в моем приложении пользователь нажимает кнопку «Войти/зарегистрироваться Facebook», что делает запрос на auth/facebook/cp маршрут.

  2. Расчет маршрута setUpFBStrategy. Я добавляю, что пользователь текущей страницы смотрит на callbackUrl.

  3. PassportJS отправляет перенаправление обратно в браузер пользователя, а браузер пользователя перенаправляет на facebook для аутентификации.

  4. , когда facebook завершает аутентификацию пользователя, он отправляет перенаправление на браузер пользователя, поэтому браузер перенаправляет на callbackURL с URL-адресом, указанным на шаге 2. Он также добавляет querystring ?code= к обратному URL-адресу. Является ли эта версия хеширования версией того, что Facebook возвращает, так что в моем случае общественная информация и электронная почта?

  5. Теперь выполняется мой сервер «auth/facebook/callback» и выполняется проверка обратного вызова. В зависимости от того, звоню ли я done(null,profile) и т. Д. Внутри проверить сервер обратного вызова перенаправить на браузер и переадресацию браузера на successRedirect или failureRedirect 'successRedirect' или 'failureRedirect' маршруты.

Все, кажется, работает до сих пор, но верно ли мое понимание? Is 'code' querystring хешированная версия деталей facebook возвращается? Почему мне даже нужны serializeUser и deserializeUser функции в моем коде? Когда я буду использовать refreshToken и accessToken?

ответ

0

Да, ваш код выглядит нормально.

passport.serializeUser и passport.deserializeUser и функция, обеспечиваемая паспорта

passport.serializeUser вызывается один раз при входе в систему, когда вы звоните

req.logIn(someValue,function(){}) 

здесь SomeValue значение, которое вы хотите сохранить в паспортный стол

и по каждому запросу, когда вы звоните req.isAuthenticated() функция для проверки наличия паспортного сеанса или нет, паспорт.deserializeUser будет называться возвратом true или false. , а в конце пользовательского режима просмотра при выходе из системы вы вызываете req.session.destroy, чтобы уничтожить эту сессию пользовательских пользователей.

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