2013-10-17 66 views
1

我是新使用Express和Connect,所以我希望我做一些愚蠢的,有一個簡單的解決方案...如何在交叉源請求中保留會話數據?

基本上,我有一個頁面,用戶使用Persona登錄。要驗證身份驗證嘗試,我使用express-persona。假設該模塊將用戶驗證的電子郵件地址保存在會話變量(默認爲req.session.email)中。

現在,登錄後,用戶可以發表評論,此評論將與用戶登錄的電子郵件地址一起保存。當服務該表單的服務器與處理該表單的服務器相同時張貼評論,這工作正常。然而,當它們不同時(假設用戶填寫表格http://localhost:8001,而瀏覽器然後發送POST請求http://localhost:8000應保存評論),突然req.session.email值爲undefined

認爲我正確設置了跨源資源共享。形式發送正是如此(使用jQuery):

$.ajax('http://localhost:8000/post/comment', 
     { 
      data: {comment: $('#commentField').val()}, 
      type: 'POST', 
      xhrFields: {withCredentials: true} 
     } 
); 

(注意xhrField: {withCredentials: true} - 會話cookie被傳承下去,這是我通過檢查網絡請求驗證)

服務器設置的(我認爲)正確的CORS頭:

res.header('Access-Control-Allow-Origin', 'http://localhost:8001'); 
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); 
res.header('Access-Control-Allow-Credentials', 'true'); 

當我添加console.log(req.cookie),我看到sessionId的cookie具有相同的值作爲一個與POST請求一起發送。

但是:console.log(req.session.email)顯示undefined對跨域請求 - 再次,當請求來自同一產地,它工作正常。

我在做什麼錯?

+0

您要在哪裏放置console.log語句?你的Express .use()語句是什麼樣的?在express-pesona中間件有機會運行並更新會話信息之前,您是否正在運行console.log? – monsur

+0

console.log()位於Express應用程序中,在使用()腳本和註釋處理模塊之後調用 - 當請求來自同一個源時,它們輸出正確的值。 – Vincent

回答

5

我發現我的問題:我忘記發送與身份驗證請求的cookie。因此,Express服務器在登錄時無法識別當前用戶的會話,因此無法將用戶數據保存到會話中。

的解決方案是派也與withCredentials標誌人物角色斷言的請求,因爲這樣的:

var response = $.ajax(assertionUrl + '/verify', { 
    data: {assertion: assertion}, 
    type: 'POST', 
    xhrFields: {withCredentials: true} 
}); 

(我不認爲任何人都不會碰到這個確切的同樣的問題,但以防萬一。 ..)

2

對於那些正在尋找解決與Angular實現相同的問題。您可以使用以下配置$ http來發送cookie:

.config(function ($routeProvider, $httpProvider) { 
    $httpProvider.defaults.withCredentials = true; 
    //rest of route code 
+0

您的鏈接指向此頁:) – Vincent

+0

我找不到原來的鏈接了。我已將其從我的帖子中刪除 –