Jak skonfigurować CORS?

12

Drupal 8 ma wbudowany rdzeń usługi internetowej RESTful, a od wersji 8.2 nie potrzebujemy modułu cors .

Teraz, aby korzystać z usług, po prostu włączamy i konfigurujemy plik default.service.yml, jak określono tutaj

Nie byłem jednak w stanie skonfigurować tego ustawienia, aby zezwolić na dostęp do usługi internetowej w innej domenie.

Moja obecna konfiguracja service.yml dla cors to:

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

Poszukałem go w celu znalezienia dalszej szczegółowej konfiguracji, ale nie mogłem go znaleźć.

Tworzę to do testowania rozwoju w dwóch różnych domenach.

Korzystanie ze środowiska deweloperskiego Panteon dla usług internetowych i niestandardowej domeny .dev dla lokalnego hosta do korzystania z tych usług.

Dostęp do usługi działa poprawnie dzięki rozszerzeniu chrome CORS.

sarathkm
źródło
Jeśli zmieniłeś już swoją stronę / default / services.yml, jak napisano w poprzednich odpowiedziach, i to nie działało, upewnij się, że CORS jest włączony na twoim serwerze internetowym. Na przykład w Nginx musisz dodać / zmodyfikować lokalizację w konfiguracji bloku serwera, patrz https://enable-cors.org/server_nginx.html
Pin

Odpowiedzi:

16

Natknąłem się na to dość niedawno na Panteonie i mam nadzieję, że to pomoże, jeśli jeszcze tego nie rozwiązałeś.

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

Kilka rzeczy do zapamiętania ...

Jeśli chodzi o lokalizację pliku na Panteonie, upewnij się, że plik service.yml znajduje się w / sites / default vs. just / sites. Miałem błędne wrażenie, że zadziała z obu miejsc. Działa tylko, jeśli znajduje się w katalogu / sites / default.

Zwróć uwagę na oddzieloną przecinkami listę dozwolonych nagłówków, każdy w swoim własnym zestawie cytatów. Pierwotnie miałem jeden ciąg, jak ty w powyższym przykładzie, i zawiódł niezliczoną ilość razy, zanim zauważyłem subtelną różnicę. Jestem całkiem pewien, że dozwolone Metody działają w ten sam sposób, jeśli chcesz wymienić swoje metody.

Pamiętaj również, że chociaż mój fragment kodu będzie działał dobrze w programowaniu przeciwko piaskownicy Panteonu, prawdopodobnie zechcesz go nieco zablokować przed rozpoczęciem produkcji. Dzięki Pantheon oferującemu HTTPS będziesz również musiał upewnić się, że go użyjesz, jeśli zamierzasz przekazywać informacje przez nagłówki. Mam nadzieję, że to pomoże ci, jeśli nadal masz problemy, lub ktoś, kto natknął się na to w drodze.

Shawn Matthews
źródło
4
Po co określać dozwoloneOriginy, a następnie przekazywać „*”?
Christian
Po prostu pokaż obie opcje. Prosimy pomijać jedno lub drugie.
Shawn Matthews,
narażone nagłówki powinny być fałszywe lub tablica, według drupal.org/project/drupal/issues/2905848
Jan
Jeśli ktoś jest zainteresowany, nie wierzę, że pole dozwoloneOrigins akceptuje regex. Próbowałem użyć wzorca wyrażenia regularnego, aby dodać do białej listy wiele subdomen, i Drupal narzekał. Musiałem użyć jawnej listy domen, oddzielonych przecinkami, jak w tym przykładzie. Miałem nadzieję, że będzie się zachowywać jak ustawienie zaufanych hostów w settings.php
Tony Stecca
9

Znajdź: ... / sites / default / default.services.yml

Utwórz kopię i zmień nazwę kopii na:

... / sites / default / services.yml

Znajdź tę część kodu: cors.config: enabled: false

i zamień na następujące - cors.config: włączone: prawda

Wyczyść pamięć podręczną.

Soudip Paul
źródło
Przypuszczałem, że próbowałem wszystkiego, dopóki nie zobaczyłem twojej odpowiedzi, dzięki za wskazanie najważniejszego punktu, jakim jest USUWANIE DACHU (ODBUDUJ DACH): D
emy
3

Poniższe ustawienie działa dla mnie.

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
źródło
0

posedHeaders: true jest niepoprawny i spowoduje Ostrzeżenie: implode (): niepoprawne argumenty przekazane w Asm89 \ Stack \ CorsService-> addActualRequestHeaders () (wiersz 94 / vendor / asm89 / stack-cors / src / Asm89 / Stack / CorsService. php) # 0 /web/core/include/bootstrap.inc(584) To musi być false lub tablica z dozwolonymi nagłówkami do ujawnienia patrz https://developer.mozilla.org/en-US/docs/Web/ HTTP / Nagłówki / Kontrola dostępu-Ujawnij nagłówki

Jagermonster
źródło