2012-11-29 95 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。

    相关问题