2014-07-12 29 views
0

我正在編寫一個網站,除非用戶通過Google登錄(並且他們的電子郵件位於硬編碼列表中),否則不應訪問其內容。 PassportJS讓一切變得簡單,與像重定向到授權後的passportjs-google原始頁面(沒有會話)

app.all '*', (req, res, next) -> 
    if req.isAuthenticated() 
     next() 
    else 
     passport.authenticate('google')(req, res, next) 

如果用戶沒有通過驗證中間件,他們踢翻以谷歌爲auth--到目前爲止好。當谷歌在AUTHS用戶來說,將它們發送給我的回報網址:

app.get '/auth/google/return', passport.authenticate('google', 
    successRedirect: '/' 
    failureRedirect: '/login' 
) 

不過,我不希望我的用戶發送回/,我想送他們去,他們試圖訪問的原始地址。

如何使用passportjs/passport-google將我的用戶重定向到他們最初嘗試訪問的頁面,當我的中間件發現他們未經身份驗證並將他們踢向Google?

我見過使用會話狀態的一些建議,但我不想這樣做,因爲它很笨拙 - 我想象如果用戶打開多個選項卡到網站,並要求登錄每個,所有的選項卡最終都會指向最後一個嘗試去的url。

有沒有辦法做到這一點沒有會議?

回答

0

您可以將當前網址(req.originalUrl)存儲在req.session中,並通過passport.js策略將用戶重定向到/auth/success的網址。並且/auth/success重定向到最後一頁。 我找不到一個版本,不使用這個會話。

app.get('/auth/success', function(request, response) { 
    response.redirect(request.session.lastUrl || '/'); 
}); 

app.get('/auth/google/return', passport.authenticate('google', { 
    successRedirect: '/auth/success' 
    failureRedirect: '/login'} 
)); 

app.use(function(req, res, next){ 
    req.session.lastUrl = req.originalUrl; 
    if (req.isAuthenticated()) { 
     next() 
    } else { 
     passport.authenticate('google')(req, res, next); 
    } 
}); 
+0

我特別不想使用會話 –

+0

passport.js使用會話,所以可能你必須使用它。如果您擔心,會話存儲可能是單點故障,您可以使用會話存儲加密的cookies http://www.senchalabs.org/connect/cookieSession.html – vodolaz095

+0

我也發現這個 - https:/ /github.com/mozilla/node-client-sessions – vodolaz095

相關問題