2016-05-06 42 views
1

我在我的應用中使用帶有passportJS的NodeJ,以允許用戶使用Facebook登錄/註冊。它似乎工作正常,不知道如果我完全理解那裏發生了什麼。所以這個想法是,用戶可以嘗試使用Facebook的詳細信息從我的應用中的不同頁面登錄。 Facebook的返回我以後所有的細節我登錄他們或使用何種Facebook的返回註冊新用戶,並做到這一點後,他們重定向到相同的頁面,但被已經登錄的代碼是:帶Facebook策略的PassportJS,我的代碼是否正確?

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. 當臉書完成身份驗證用戶時,它會發送重定向到用戶瀏覽器,以便瀏覽器重定向到callbackURL,並使用步驟2中指定的URL。它還將'?code='querystring附加到回調URL。這是查詢字符串哈希版Facebook的返回,所以在我的情況下,公共信息和電子郵件?

  5. 現在我的服務器'auth/facebook/callback'被執行並驗證回調被執行。根據我呼籲done(null,profile)等內部驗證回調服務器返回重定向到瀏覽器和瀏覽器重定向到successRedirectfailureRedirect'successRedirect'或'failureRedirect'路線。

這一切似乎工作到目前爲止,但我的理解是正確的? 'code'查詢字符串哈希版本的詳細信息Facebook返回?爲什麼在我的代碼中甚至需要serializeUserdeserializeUser函數?我什麼時候可以使用refreshTokenaccessToken

回答

0

是的,你的代碼似乎很好。

passport.serializeUser和passport.deserializeUser和功能的護照

passport.serializeUser被調用一次就當你調用

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

登錄時提供此someValue中是要在存儲的值護照會話

並且當您撥打req.isAuthenticated()函數檢查護照會話是否存在時,將會調用passport.deserializeUser返回true或false。 並且在用戶瀏覽結束時意味着註銷時您調用req.session.destroy來銷燬該特定用戶會話。