2013-09-30 5 views
10

У меня есть ситуация, когда приложение может быть доступно из нескольких разных доменов. Например, 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 не будет работать. Мне нужно иметь обоих сразу. В идеале я бы поставил его на другой домен для каждого запроса, но я не уверен, как это сделать. Мои запросы очень асинхронны, и если я просто устанавливаю его для всего приложения при каждом запросе, я боюсь, что он не сработает, когда сразу придут два вызова.

Возможно ли это? У кого-нибудь есть идеи решить это?

+0

@fardjad это было бы идеально, у вас была бы больше информации? Я не так привык, как мне хотелось бы, чтобы я был с middlewares –

+0

Так что, по существу, я бы перебирал список доменов, на которых я хочу установить сеансы, и делать app.use для каждого из них? Таким образом, в начале моего приложения будет существовать куча различного промежуточного программного обеспечения express.session, и он будет активен на протяжении всего моего приложения? –

ответ

15

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

  • написать промежуточное программное приложение может использовать вместо express.session по умолчанию промежуточного слоя в
  • в том, что промежуточное программное обеспечение, на основе заголовка instatiate 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); 

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

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

+0

HTTP запрещает сервер домена X устанавливать cookie для домена Y. Я считаю, что мой подход выше решает проблему пользователя, как описано, однако он не переносит один идентификатор сеанса для одного браузера, который посещает несколько имен узлов, но он позволяет одно приложение для работы с несколькими именами хостов. –

+0

Да, если вы хотите начать обмен информацией по доменам, посмотрите не дальше, чем на удивительный мир отслеживания онлайн-рекламы для арсенала инвазивных методов, таких как пиксели отслеживания и т. Д. –

+0

Святой ад, спасибо вам большое. Я только что закончил его реализацию, и я наконец смогу вернуться домой. Работает как шарм. Вы не представляете, насколько я рад, что понял. Из-за серии событий это происходило на реальном сервере, и его нужно было быстро фиксировать. Спасибо. –

Смежные вопросы