509 Stimmen

CORS: Kann kein Platzhalter in Access-Control-Allow-Origin verwenden, wenn das credentials-Flag auf true gesetzt ist

Ich habe ein Setup, das Folgendes umfasst

Frontend-Server (Node.js, Domain: localhost:3000) <---> Backend (Django, Ajax, Domain: localhost:8000)

Browser <-- webapp <-- Node.js (Die App bereitstellen)

Browser (webapp) --> Ajax --> Django (Ajax-POST-Anfragen bereitstellen)

Mein Problem hier liegt jetzt beim CORS-Setup, das die Web-App verwendet, um Ajax-Aufrufe an den Backend-Server zu tätigen. In Chrome erhalte ich immer

Kann kein Platzhalter in Access-Control-Allow-Origin verwenden, wenn das Flag für Berechtigungen true ist.

Funktioniert auch nicht in Firefox.

Mein Node.js-Setup ist:

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
};

Und in Django verwende ich dieses Middleware zusammen mit diesem

Die Web-App sendet Anfragen wie folgt:

$.ajax({
    type: "POST",
    url: 'http://localhost:8000/blah',
    data: {},
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true,
    dataType: 'json',
    success: successHandler
});

Also sehen die Anfrageheader, die die Web-App sendet, wie folgt aus:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"

Und hier ist der Antwort-Header:

Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json

Wo mache ich einen Fehler?!

Bearbeiten 1: Ich habe chrome --disable-web-security benutzt, aber möchte jetzt, dass die Dinge tatsächlich funktionieren.

Bearbeiten 2: Antwort:

Also die Lösung für mich ist die django-cors-headers Konfiguration:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000' # Hier lag tatsächlich das Problem und es muss http://localhost:3000 heißen, nicht http://localhost:3000/
)

0voto

connectedMind Punkte 351

Hatte dieses Problem mit Angular, wobei ein Auth-Interceptor verwendet wurde, um den Header zu bearbeiten, bevor die Anfrage ausgeführt wird. Wir haben ein API-Token zur Authentifizierung verwendet, daher hatte ich Anmeldeinformationen aktiviert. Jetzt scheint es nicht mehr notwendig/erlaubt zu sein

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest, next: HttpHandler): Observable> {
    req = req.clone({
      //withCredentials: true, //nicht mehr benötigt
      setHeaders: {
        'Content-Type' : 'application/json',
        'API-TOKEN' : 'xxx'
      },
    });

    return next.handle(req);
  }

Ansonsten gibt es derzeit keine Nebenwirkungen.

0voto

hamdi bougacha Punkte 21

Set 'supports_credentials' => true, in der Datei config/cors.php funktioniert wie ein Zauber

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X