![](/img/trans.png)
[英]passportjs req.isAuthenticated() returns False because passport.deserializeUser() never runs in certain browsers
[英]PassportJS Facebook login isAuthenticated returns false even though authentication succeeds
出於某種原因,在我的NodeJS Express應用程序上,當使用Facebook通過PassportJS庫進行身份驗證時,無論身份驗證成功並返回配置文件數據,對request.isAuthenticated()
調用始終返回false
。
我已經聲明我的身份驗證回調將成功重定向到/profile
路由,它成功完成:
app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/profile', failureRedirect: '/' }));
使用在確定是否繼續處理請求之前驗證身份驗證的函數聲明此路由:
app.get('/profile', ensureAuthenticated, user.list);
該功能的定義如下:
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
return res.redirect('/')
}
你可以看到一切都很簡單。 我這里沒有做任何特別特別的事。
逐步通過PassportJS的代碼顯示它不會在請求中存儲用戶數據,除非您在聲明身份驗證中間件時在選項dict中指定assignProperty
。 它是在調用isAuthenticated()
時嘗試訪問的同一屬性,因為它從不存儲這些數據,它總是聲稱我沒有經過身份驗證。
不幸的是,指定此密鑰會assignProperty
Express的路由匹配,這會導致404錯誤處理回調URL,因為檢查assignProperty
的代碼會立即轉移到處理下一個可用路由。
我已經將代碼全部添加到了pastie中 。 我很感激任何人都能提供的任何幫助。
嘗試將cookieParser
和session
中間件移到Passport中間件之前:
app.use(express.cookieParser());
app.use(express.session({ secret: '--- OMMITTED ---' }));
app.use(passport.initialize());
app.use(passport.session());
原因是Express按聲明順序執行中間件。 在您當前的情況下,請求在cookie /會話中間件(Passport中間件所依賴的)之前訪問Passport中間件。
(順便說一句, bodyParser()
中間件也是如此,盡管你的路線當前並不依賴它)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.