所以我有一个 Node.js + Express 应用程序,我可以使用几个主机名访问:example1.com
和 example2.com
(它们不是子域!如果它们是子域,我知道该怎么做)。
我使用 Express Session 与 MongoDB Store 和通行证来管理身份验证。
I'd like to use the same session with both the domains but I can't figure out how to do it.
每次我访问这两个域时,它都会创建两个不同的 session ,我无法理解在哪里可以检查 session 是否已经启动并将其用于两个域。
基本上这是我当前的快速初始化文件(我删除了很多东西,只是为了专注于 session ):
'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;
};
有什么提示吗?
最佳答案
IMO 唯一的方法是,如果您能够在服务器端确定请求来自同一浏览器/计算机。因为,浏览器不会共享 session ID cookie(因为请求是针对两个不同的域),并且在服务器上您会认为它是一个新的 session 请求,并且您始终会向客户端授予新的 session ID。
如果您确实想要拥有单个 session 存储,我建议您使用以下想法编写自己的 session 存储:
首先,session不要使用cookie,使用浏览器的localstorage,对服务器端需要存储在客户端的sessionId进行签名,这样可以防止被篡改。此 session ID 将包含在使用 AJAX 和客户端 JS 的请求中,在每个请求中充当 sessionId cookie。
其次,当打开一个域时,打开其他域的 iframe,假设如果打开 example1.com,则应该打开 example2.com 的 iframe,反之亦然。在您的 iframe 中编写代码,使用 window.postMessage()
将签名的 localstorage
信息发送回父框架。由于您是所有域的所有者,因此您应该能够允许跨域进行 window.postMessage()
通信。
由于您将在所有域的每个请求中收到相同的 session ID,因此您可以检测跨域的唯一 session ,并在服务器端设计 session 存储以仅存储跨域的一个条目。
关于node.js - 如何对多个主机名使用同一个 Express session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33940769/