Экспресс-сеанс с различным доменом cookie для каждого запроса?

У меня есть ситуация, когда приложение может быть доступно из нескольких разных доменов. Например, foo.com и bar.com могли бы теоретически указывать на мое приложение. Кроме того, их поддомены также могут указывать на мое приложение, например, на red.foo.com и blue.foo.com. Я использую экспресс файлы cookie, и мой код инициализации для сеанса выглядит следующим образом:

app.use(express.session({
    secret: "secret",
    cookie: {
        domain: ".foo.com"
    },
    store: new MongoStore({
        db: db
    })
}));

Это хорошо работает, когда пользователи проходят через foo.com или любой из его поддоменов, но bar.com не будет работать. Мне нужно иметь обоих сразу. В идеале я бы поставил его на другой домен для каждого запроса, но я не уверен, как это сделать. Мои запросы очень асинхронны, и если я просто устанавливаю его для всего приложения при каждом запросе, я боюсь, что он может не работать, когда сразу два вызова.

Возможно ли это? Кто-нибудь есть идеи, чтобы решить это?

Ответ 1

Вот что вы делаете:

  • напишите промежуточное программное обеспечение, которое ваше приложение может использовать вместо промежуточного ПО express.session по умолчанию.
  • в этом промежуточном программном обеспечении, основанном на host запросе заголовка запроса и настройке на примере промежуточного слоя экспресс-сессии на домен, а затем фактически выполнить функцию промежуточного программного обеспечения, подходящую для этого запроса.

псевдокод

var mwCache = Object.create(null);
function virtualHostSession(req, res, next) {
  var host = req.get('host'); //maybe normalize with toLowerCase etc
  var hostSession = mwCache[host];
  if (!hostSession) {
    hostSession = mwCache[host] = express.session(..config for this host...);
  }
  hostSession(req, res, next);
  //don't need to call next since hostSession will do it for you
}

app.use(virtualHostSession);

Мои запросы очень асинхронны, и если я просто устанавливаю его для всего приложения при каждом запросе, я боюсь, что он не сработает, когда сразу вызовут два вызова.

Абсолютно ты не можешь этого сделать. Это будет совершенно неверно.