2013-09-30 9 views
10

Ich habe eine Situation, in der auf eine App von mehreren verschiedenen Domänen zugegriffen werden kann. Zum Beispiel foo.com und bar.com könnte theoretisch beide auf meine App verweisen. Darüber hinaus können ihre Subdomains auch auf meine App verweisen, so zum Beispiel red.foo.com und blue.foo.com. Ich verwende Express-Cookie-Sitzungen und meine Initialisierungscode für die Sitzung sieht wie folgt aus:Express-Sitzung mit unterschiedlicher Cookie-Domain pro Anfrage?

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

, die gut für funktioniert, wenn Benutzer durch foo.com oder irgendetwas davon ist Subdomains, aber bar.com wird nicht funktionieren. Ich muss beides gleichzeitig haben. Im Idealfall würde ich es pro Anfrage auf eine andere Domain setzen, aber ich bin mir nicht sicher, wie ich das machen würde. Meine Anfragen sind sehr asynchron und wenn ich sie bei jeder Anfrage für die gesamte App einstelle, befürchte ich, dass es nicht funktioniert, wenn zwei Anrufe gleichzeitig eingehen.

Ist das überhaupt möglich? Hat jemand Ideen, um das zu lösen?

+0

@fardjad das wäre ideal, hätten Sie weitere Informationen? Ich bin nicht so vertraut wie ich wünschte, ich wäre mit Middlewares –

+0

Also im Wesentlichen, würde ich durch die Liste der Domänen, die ich in der Lage sein möchte, Sitzungen zu setzen, und eine app.use für jeden tun? Also würde es zu Beginn meiner App eine Reihe unterschiedlicher 'express.session'-Middleware geben, die während der gesamten Lebensdauer meiner App aktiv ist? –

Antwort

15

Hier ist was Sie tun:

  • eine Middleware-App schreiben anstelle der Standard express.session Middleware
  • in dieser Middleware, basierend auf dem host Request-Header instatiate und konfigurieren auf Instanz verwenden können die Express-Session-Middleware pro Domäne, und führen Sie dann tatsächlich die Middleware-Funktion geeignet für diese Anfrage

Pseudo-Code

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); 

sind meine Anfragen sehr asynchron und wenn ich bei jeder Anfrage für die gesamte App legen Sie es nur, ich fürchte, es könnte nicht funktionieren, wenn zwei Anrufe auf einmal kommen.

Absolut können Sie das nicht tun. Es wird völlig falsch sein.

+0

HTTP verbietet Domain-X-Server ein Cookie für Domäne Y. Ich glaube, mein Ansatz oben löst das Problem des Benutzers wie beschrieben, jedoch wird es nicht eine einzige Sitzungs-ID für einen Browser mit mehreren Host-Namen übertragen, aber es wird zulassen Eine einzelne App, die auf mehreren Hostnamen funktioniert. –

+0

Ja, wenn Sie anfangen möchten, Informationen über Domains zu teilen, suchen Sie nicht weiter als die fantastische Welt der Online-Werbetracking für ein Arsenal von invasiven Techniken wie Tracking-Pixel, etc. –

+0

Heilige Hölle vielen Dank. Ich habe es gerade fertiggestellt und kann endlich nach Hause gehen. Klappt wunderbar. Du hast keine Ahnung, wie erleichtert ich bin, das herausgefunden zu haben. Aufgrund einer Reihe von Ereignissen geschah dies auf einem Live-Server und es musste schnell behoben werden. Vielen Dank. –