Wie richte ich CORS ein?

12

Drupal 8 verfügt über einen integrierten RESTful-Webdienst, und seit 8.2 benötigen wir kein Cors-Modul .

Jetzt Dienste nutzen wir nur aktivieren und konfigurieren default.service.yml Datei als in bestimmten hier

Ich konnte dieses Setup jedoch nicht so konfigurieren, dass der Webdienstzugriff über eine andere Domäne möglich ist.

Mein aktuelles service.yml-Setup für cors lautet:

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token,authorization,content-type,accept,origin,x-requested-with']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['POST, GET, OPTIONS, DELETE, PUT']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: 1000
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: false

Ich habe gegoogelt, um weitere detaillierte Konfigurationen zu finden, konnte aber keine finden.

Ich erstelle dies für die Testentwicklung in zwei verschiedenen Bereichen.

Verwenden der pantheon dev-Umgebung für Webdienste und der benutzerdefinierten .dev-Domäne von localhost zum Konsumieren dieser Dienste.

Der Servicezugriff funktioniert einwandfrei mit der Chrome CORS-Erweiterung.

Sarathkm
quelle
Wenn Sie Ihre Site / default / services.yml bereits wie in den vorherigen Antworten angegeben geändert haben und es nicht funktioniert hat, stellen Sie sicher, dass CORS auf Ihrem Webserver aktiviert ist. In Nginx müssen Sie beispielsweise einen Speicherort in Ihrer Serverblockkonfiguration hinzufügen / ändern, siehe https://enable-cors.org/server_nginx.html
Pin

Antworten:

16

Ich bin vor kurzem auf Pantheon darauf gestoßen, und hoffentlich hilft das, wenn Sie es noch nicht gelöst haben.

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with', 'access-control-allow-origin','x-allowed-header','*']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['*']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['http://localhost/','http://localhost:3000','http://localhost:3001','http://localhost:3002','*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: false
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: true

Ein paar Dinge zu beachten ...

Stellen Sie in Bezug auf den Speicherort der Datei im Pantheon sicher, dass sich Ihre Datei service.yml in / sites / default vs just / sites befindet. Ich hatte fälschlicherweise den Eindruck, dass es von beiden Orten aus funktionieren würde. Es funktioniert nur im Verzeichnis / sites / default.

Beachten Sie die durch Kommas getrennte Liste der erlaubten Header, die jeweils in eigenen Anführungszeichen stehen. Ich hatte ursprünglich eine einzelne Zeichenfolge, wie Sie es in Ihrem obigen Beispiel getan haben, und sie schlug unzählige Male fehl, bevor ich den subtilen Unterschied bemerkte. Ich bin mir ziemlich sicher, dass allowMethods genauso funktioniert, wenn Sie Ihre Methoden speziell auflisten möchten.

Bitte beachten Sie auch, dass mein Code-Snippet zwar gut für die Entwicklung gegen eine Pantheon-Sandbox geeignet ist, Sie aber wahrscheinlich vor Produktionsbeginn die Dinge etwas mehr sperren möchten. Wenn Pantheon HTTPS anbietet, sollten Sie es auch verwenden, wenn Sie Informationen über Header weitergeben möchten. Ich hoffe, dies hilft entweder Ihnen, wenn Sie immer noch Probleme haben, oder jemand anderem, der später darauf gestoßen ist.

Shawn Matthews
quelle
4
Warum erlaubteOrigins angeben und dann auch '*' übergeben?
Christian
Einfach um beide Optionen zu zeigen. Bitte zögern Sie nicht, das eine oder andere wegzulassen.
Shawn Matthews
exponiertHeader sollten falsch oder ein Array sein, per drupal.org/project/drupal/issues/2905848
John
Wenn jemand interessiert ist, glaube ich nicht, dass das Feld allowOrigins Regex akzeptiert. Ich habe versucht, ein Regex-Muster zu verwenden, um mehrere Subdomains auf die Whitelist zu setzen, und Drupal hat sich beschwert. Ich musste wie in diesem Beispiel eine explizite Liste von Domänen verwenden, die durch Kommas getrennt sind. Ich hatte gehofft, es würde sich wie die Einstellung für vertrauenswürdige Hosts in settings.php verhalten
Tony Stecca
9

Suchen Sie nach: ... / sites / default / default.services.yml

Erstellen Sie eine Kopie und benennen Sie die Kopie um in:

... / sites / default / services.yml

Suchen Sie diesen Teil des Codes: cors.config: enabled: false

und durch Folgendes ersetzen: - cors.config: enabled: true

Leeren Sie den Cache.

Soudip Paul
quelle
Ich habe alles versucht, bis ich Ihre Antwort gesehen habe. Vielen Dank, dass Sie den wichtigsten Punkt gezeigt haben, der darin besteht, den CACHE zu löschen (CACHE WIEDERAUFBAUEN): D
emy
3

Die folgende Einstellung funktioniert für mich.

cors.config:
  enabled: true
  # Specify allowed headers, like 'x-allowed-header'.
  allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with']
  # Specify allowed request methods, specify ['*'] to allow all possible ones.
  allowedMethods: ['*']
  # Configure requests allowed from specific origins.
  allowedOrigins: ['*']
  # Sets the Access-Control-Expose-Headers header.
  exposedHeaders: false
  # Sets the Access-Control-Max-Age header.
  maxAge: false
  # Sets the Access-Control-Allow-Credentials header.
  supportsCredentials: false
Aditya Joshi
quelle
0

exponiertHeaders: true ist ungültig und verursacht Warnung: implode (): Ungültige Argumente, die in Asm89 \ Stack \ CorsService-> addActualRequestHeaders () übergeben wurden (Zeile 94 von / vendor / asm89 / stack-cors / src / Asm89 / Stack / CorsService. php) # 0 /web/core/includes/bootstrap.inc(584) Es muss entweder false oder ein Array mit zulässigen Headern sein, um verfügbar zu machen, siehe https://developer.mozilla.org/en-US/docs/Web/ HTTP / Header / Access-Control-Expose-Header

Jagermonster
quelle