如何为多个主机名使用相同的Express会话?

时间:2015-11-26 14:10:15

标签: node.js session express passport.js

所以我有一个 Node.js + Express 应用我可以使用几个主机名访问:example1.comexample2.com(它们是不是子域名!我知道如果它们是子域名,该怎么做。)

我使用Express Session与MongoDB Store和passport来管理身份验证。

  

我想与两个域使用相同的会话,但我不能   弄清楚该怎么做。

每次我访问这两个域时,它会创建两个不同的会话,我无法理解我在哪里可以检查会话是否已经启动,并将其用于两个域。

基本上这是我当前的快速初始化文件(我删除了很多东西,只关注会话):

'use strict';

/**
 * Module dependencies.
 */
var express = require('express'),
    bodyParser = require('body-parser'),
    session = require('express-session'),
    cookieParser = require('cookie-parser'),
    passport = require('passport'),
    MongoDBStore = require('connect-mongodb-session')(session),
    config = require('./config');

module.exports = function(db) {
    // Initialize express app
    var app = express();

    // CookieParser should be above session
    app.use(cookieParser());

    var store = new MongoDBStore(
      { 
        uri: config.db,
        collection: config.sessionCollection
      });

    // Express MongoDB session storage
    app.use(session({
      saveUninitialized: true,
      resave: true,
      secret: config.sessionSecret,
      store: store,
    }));

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

    return app;
};

任何提示?

1 个答案:

答案 0 :(得分:0)

IMO唯一的办法就是,如果你能够在服务器端找出该请求来自同一个浏览器/机器。因为,浏览器不会共享会话Id cookie(因为请求是针对两个不同的域),而在服务器上,您会认为它是一个新的会话请求,并且您总是会向客户端授予一个新的sessionId。

如果您真的想拥有单一会话商店,我建议您使用以下想法编写自己的会话商店:

首先,不要使用cookie进行会话,并使用浏览器的localstorage并从需要存储在客户端的服务器上签署sessionId,以防止被篡改。在每个充当sessionId cookie的请求中,此会话ID将包含在使用您的AJAX和客户端JS的请求中。

其次,打开域名时打开其他域名的iframe,假设如果打开example1.com,则应打开example2.com的iframe,反之亦然。在您的iframe中编写代码,使用localstorage将签名的window.postMessage()信息发送回父框架由于您是所有域的所有者,因此您应该允许跨域进行window.postMessage()通信。

因为,您将在所有域中的每个请求中收到相同的会话ID,您可以检测跨域的唯一会话,并在服务器端设计会话存储,以便只跨域存储一个条目。