2014-07-22 2 views
28

Ich versuche, CORS in node.js zulassen, aber das Problem ist, dass ich *Access-Control-Allow-Origin nicht festlegen kann, wenn Access-Control-Allow-Credentials festgelegt ist.Aktivieren Sie Access-Control-Allow-Origin für mehrere Domänen in Nodejs

Auch die Spezifikation, sagte ich kann für Access-Control-Allow-Origin und die vorgeschlagene Methode wäre, etwas zu tun, ähnlich wie diese Access-Control-Allow-Origin Multiple Origin Domains?

ein Array oder ein Komma getrennt Wert nicht tun, aber ich kann nicht auf diese Weise in Knoten zu tun scheinen Js

["http://mydomain.com:9001", "http://mydomain.com:5001"].map(function(domain) { 
    res.setHeader("Access-Control-Allow-Origin", domain); 
}); 
res.header("Access-Control-Allow-Credentials", true); 

das Problem hier ist, dass es bein Überschreibung durch den letzten Wert im Array, so wird der Header res.setHeader("Access-Control-Allow-Origin", "http://mydomain.com:5001");

Fehler aus dem Client-Browser eingestellt werden:

XMLHttpRequest kann http://mydomain.com:9090/api/sync nicht geladen werden. Der 'Access-Control-Allow-Origin'-Header hat einen Wert ' http://mydomain.com:5001 ', der nicht dem angegebenen Ursprung entspricht. Ursprung 'http://mydomain.com:9001' ist daher nicht erlaubt.

Antwort

72

Hier ist, was ich in meiner ausdrücklichen Anwendung verwenden, um mehrere Ursprünge

app.use(function(req, res, next) { 
    var allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000']; 
    var origin = req.headers.origin; 
    if(allowedOrigins.indexOf(origin) > -1){ 
     res.setHeader('Access-Control-Allow-Origin', origin); 
    } 
    //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020'); 
    res.header('Access-Control-Allow-Methods', 'GET, OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); 
    res.header('Access-Control-Allow-Credentials', true); 
    return next(); 
}); 
+0

Schön! Das ist genau das, was ich brauchte! – Scotty

+3

Gibt es einen Unterschied zwischen res.header und res.setHeader? –

+0

Abfrage: Was ist der Grund, warum Sie 'return' vor dem 'next()' schreiben, wird nicht als nächstes automatisch aufgerufen und Anfrage an die nächste Middleware senden? –

9

nicht sicher, ob dies zu spät ist, aber ich es gelöst, indem: res.setHeader ("Access-Control-Allow-Origin", req.headers.origin);

Dies wird einfach jede Verbindung zulassen, da die Header.Origin mit jeder Abfrage gesendet wird. Da ich insgesamt Node.js und Webnoob im Allgemeinen bin, würde ich mich über Kommentare zu dieser Antwort freuen. Auch dies würde wahrscheinlich den Zweck mit der Einschränkung, was Ursprünge zu akzeptieren, zu besiegen und ist wahrscheinlich schrecklich in der Produktion zu verwenden.

Sie können eine Funktion schreiben, um zu überprüfen, ob die req.headers.origin eine Domäne auf der weißen Liste ist (aus einem hartcodierten Array) und die Domäne einfach zurückgibt, wenn sie im Array vorhanden ist.

+0

Das war wirklich hilfreich zu ermöglichen! –

+0

Dies ist unglaublich die beste Lösung. Ich wünschte, es wäre die erste Antwort. – dman

+4

Dies ist eine zu komplizierte Art zu sagen res.setHeader ("Access-Control-Allow-Origin", "*"); –

5

Überprüfen Sie Ihre Whitelist gegen das, was Sie für Ihre Anfrage benötigen.

var origins = ['a.com', 'b.com', 'c.com', 'boobies.com']; 
for(var i=0;i<origins.length;i++){ 
    var origin = origins[i]; 
    if(req.headers.origin.indexOf(origin) > -1){ 
     res.setHeader('Access-Control-Allow-Origin', req.headers.origin); 
     return; 
    } 
    // else, tough cookies. 
} 

Genießen.

+0

* Beachten Sie, dass diese Lösung keine * .boobies.com oder *, Domains behandelt. –

+0

Ich bin mir nicht sicher, ob der Code vollkommen korrekt ist. Aber es hat mir geholfen, meine eigenen zu implementieren .. so +1. – Chandru

4

Hier ist eine einfache Middleware-Funktion, um den richtigen CORS-Header aus einer Whitelist zu bedienen. Wenn Sie dies ganz oben in Ihrer Express-App festlegen, können alle Ihre Routen die richtige Kopfzeile von der Whitelist aus festlegen, bevor Inhalte bereitgestellt werden.

app.use(function(req, res, next){ 
    var whitelist = ['localhost:4000', 'localhost:3000', 'anydomain.com'] 
    var host = req.get('host'); 

    whitelist.forEach(function(val, key){ 
    if (host.indexOf(val) > -1){ 
     res.setHeader('Access-Control-Allow-Origin', host); 
    } 
    }) 

    next(); 
}); 
Verwandte Themen