2015-11-05 105 views
0

我目前在執行護照js和護照本地貓鼬插件時遇到以下問題。帳戶創建和登錄正常工作。然而,我在護照登錄後,從來沒有確定我爲已登錄用戶護照本地貓鼬req.user undefined

我用下面的代碼片段:

在我的用戶模型:

User.plugin(passportLocalMongoose); 

在應用.js文件(包含這個順序是正確的?):

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(cookieParser('keyboard cat')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(session({ secret: 'keyboard cat' })); 

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.use(new LocalStrategy(User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

在我的路線:

router.post('/login', passport.authenticate('local'), function(req, res) { 
    res.json({ loggedIn: true }); 
}); 

返回true,但下面保持返回false(後登錄):

req.isAuthenticated() 

誰能賜教原因可能是什麼呢?

謝謝!

+0

你想實現一個快速的方法,以確保他們訪問應用程序的部件之前,你的用戶進行身份驗證?如果是這樣的話,我會建議一種簡單的方法來創建一個express.js中間件來檢查用戶是否登錄,如果沒有,將會重定向到/ login頁面。 – chridam

+0

'res.json({loggedIn:true}); '將永遠回報真實。 res.json({loggedIn:req.isAuthenticated()})是否返回true? –

+0

res.json({loggedIn:true}); 並不總是返回true。 passport.authenticate('local')是當身份驗證失敗時不會調用next()的中間件。 – user2817219

回答

1

您可能想要嘗試Express middelware,如評論中所述。

例如:

function isAuthenticated(req, res, next) { 
    if(req.isAuthenticated()) { 
     return next() 
    } else { 
     // redirect users to login page 
    } 
} 

app.get('/anypage', isAuthenticated, function(req, res) { 
    // some reoute logic 
}) 
+0

這與它無關。 req.isAuthenticated()總是返回假,即使我成功登錄之前。我覺得它是一個session/cookies問題。 – user2817219

1

從外觀上來看,您的訂單是好的。訂單中最重要的部分是passport.initialize()passport.session()在您的express-session配置之後。

至於初始身份驗證工作的問題,但隨後的請求顯示未經身份驗證的用戶,問題很可能是因爲cookie。之前我遇到過類似的問題,問題在於客戶端發出HTTP請求的方式。

如果您使用的是ES6 fetch API,那麼您需要確保將密鑰credentials傳遞給值爲"include"的選項對象。

例如:

fetch('/restricted', { 
    method: 'get', 
    credentials: 'include' 
}); 

fetch API不會在cookie中,除非你指定它發送憑據。希望這可以幫助。

其他資源:https://developers.google.com/web/updates/2015/03/introduction-to-fetch