node.js - 如何对多个主机名使用同一个 Express session ?

标签 node.js session express passport.js

所以我有一个 Node.js + Express 应用程序,我可以使用几个主机名访问:example1.comexample2.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/

相关文章:

javascript - Node.js - 限制直接访问服务器?仅当来自其他页面并且存在表单 POST 变量时才允许/加载

javascript - mvc session 过期后,如何使整个页面重定向到登录?

java - 如何在 Android Activity 之间的 HttpContext 中保留 HTTP session cookie?

MySQL Master(Active) - Master(Active) 复制

javascript - Express.js 和 Bluebird - 处理 promise 链

javascript - Express、Node、Angular 向前端发送音频文件

node.js - 如何在非 Electron 网页上从Electron接收事件

node.js - req.session.id 不同于 req.session._id

node.js - Express 在每个端点前面添加/api/

javascript - 不确定 Node.js 代码是否异步