2012-11-29 125 views
7

我目前有兩個獨立的節點應用程序在兩個不同的端口上運行,但共享相同的後端數據存儲。我需要在兩個應用程序之間共享用戶會話,以便當用戶通過一個應用程序登錄時,他們的會話可用,並且他們似乎登錄到另一個應用程序。在這種情況下,它是一個面向公衆的網站和管理後端。節點應用程序之間的共享會話?

我們的設置是這樣的:用快遞

  • 護照

    • 節點被用來處理身份驗證與本地戰略
    • 我們使用連接,Redis的,讓我們一起分享通過Redis的會議。
    • 我們的域名是這樣的:www.mydomain.com和adm.mydomain.com

    爲會議的東西(和Redis的)是這兩個應用相同的配置:

    session: { 
        options: { 
         secret: "my secret", 
         cookie: { 
          domain: "mydomain.com", 
          maxAge:1000*60*60*24 
         } 
        }, 
        redis: { 
         host: 'my host', 
         maxAge: 86400000, 
         secret: "my secret" 
        } 
    } 
    

    在app.js會議東西的配置是這樣的:

    if (app.settings.env === "production") { 
        session.options.store = new RedisStore(session.redis); 
    } 
    app.use(express.session(session.options)); 
    app.use(passport.initialize()); 
    app.use(passport.session({ secret: 'a different secret' })); 
    

    我希望它做什麼:讓我們看到同樣的SESS在兩個應用程序之間的Cookie中添加ion id。

    所以我的問題是:如何設置express,redis和護照,以便您可以讓會話跨不同的子域共享?

  • +2

    我想你可能需要:

    var Cookie = module.exports = function Cookie(options) { this.path = '/'; this.maxAge = null; this.httpOnly = true; if (options) merge(this, options); ... 

    所以,這樣的事情會爲當前主1.10.1工作將cookie域指定爲'「.mydomain.com」' - 注意前面的'.'。沒有「*」的 –

    +0

    ?我們昨天在測試中使用了「* .mydomain.com」,但似乎沒有奏效。 今天早上我會試試看看結果是什麼。 – jpittman

    +1

    你輸入了一個'*',對吧?在那種情況下,是的,只是最重要的點。我認爲這就是使Cookie可以從不同子域讀取的原因。讓我知道,我可以提供它作爲答案。 –

    回答

    4

    也許有點過時了,但是在這個時候,Express-session可以識別cookie的域選項。據源:

    function session(options){ 
        var options = options || {} 
        // name - previously "options.key" 
        , name = options.name || options.key || 'connect.sid' 
        , store = options.store || new MemoryStore 
        , cookie = options.cookie || {} 
         ... 
    

    這是設置的cookie:

    secret: "my secret", 
        cookie: { 
         domain: "mydomain.com", 
    
    +0

    謝謝你的擡頭。我不再在這個項目上,也沒有在節點喵喵的工作,但這是一個好消息。 – jpittman

    2

    快速會話似乎無法識別Cookie的「域」選項,因此您的問題。存儲會話ID的Cookie會自動綁定到每個應用的域,因此無法共享。

    一種選擇是編寫您自己的單點登錄模塊以跨​​Web應用程序共享會話。它可能會在執行順序的早期生活在app.use()聲明中,並且會簡單地創建一個單獨的cookie(這將是跨域的),創建單獨的SSO會話標識並將SSO標識存儲在這個新的cookie中。之後,您只需根據需要交叉填充req.session和req.sso-session。

    相關問題