2016-08-22 108 views
0

我忙於構建一個包含3個不同子域的平臺 - example.com,auth.example.com和api.example.com。它們運行在服務器的不同端口上運行的3個獨立的NodeJS應用程序。跨節點應用共享Redis會話

這裏是代碼建立會話:

var session = require("express-session"); 
var redisStore = require("connect-redis")(session); 
var redisClient = require("redis").createClient(config.redis); 

app.use(session({ 
     secret: config.server.secret, 
     store: new redisStore(config.redis), 
     client: redisClient, 
     resave: false, 
     saveUninitialized: false, 
     cookie: { 
      domain: "example.co.za", 
      httpOnly: false 
     } 
})); 

的配置是完全一樣的所有3個應用程序和他們坐在同一臺服務器上。出於某種原因,這些會話不會被共享。我似乎記得幾周前他們被分享了,現在情況已經破裂 - 我們有一種狡猾的懷疑,即當我們將所有流量從HTTP轉移到HTTPS時發生這種情況。這會打破會議嗎?我試圖在限制會話的情況下打開'httpOnly',但沒有運氣。

我已經運行redid-cli MONITOR和會話,事實上,被保存在登錄(驗證應用程序),但沒有被其他應用程序檢索。當我將saveUninitialized設置爲true時,保存請求來自所有3個應用程序 - 這表明它們已連接到相同的Redis Store。

任何幫助將是偉大的。

+0

驗證被存儲什麼餅乾/每個客戶端發送,看看是否有任何區別。另外,還要檢查的頭文件(特別是'SET-Cookie'),並看看[這裏](http://stackoverflow.com/questions/7834228/set-cookie-for-domain-instead-of-subdomain-using-的NodeJS和-expressjs)。這也可能是一個太大的評論問題,但是你的認證和你的api端點需要會話有什麼原因嗎? – dvlsg

+0

原來,下面的答案解決了我的問題。感謝您的幫助。只是爲了滿足好奇心任何 - 身份驗證是創造登錄後的會話,但隨後的API需要檢查,有一個會話的有效和允許訪問之前驗證裏面的數據。 – nickcorin

回答

0

我認爲這只是一個cookie問題。瀏覽器不會將會話cookie發送回您的子域: 您需要一個領先的。在域上。例如: -

cookie: { 
    domain: ".example.co.za", 
    httpOnly: false 
} 

如果不工作,你有AJAX發出see this post

+0

謝謝!出於某種原因,我曾嘗試過這種方法,但最初並不奏效。後來當我再次嘗試時,它剛剛工作?無論哪種方式,感謝讓我試試吧:)再次 剛一說明 - 我沒有設置'僅Http:FALSE',它的工作細如'使用HTTPS TRUE'。 – nickcorin