所以我有一个 Node.js + Express 应用我可以使用几个主机名访问:example1.com
和example2.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;
};
任何提示?
答案 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,您可以检测跨域的唯一会话,并在服务器端设计会话存储,以便只跨域存储一个条目。