Bagaimana cara mengatur CORS?

12

Drupal 8 memiliki layanan web RESTful di dalam inti dan sejak 8.2 kami tidak memerlukan modul cors .

Sekarang untuk menggunakan layanan kami hanya mengaktifkan dan mengkonfigurasi file default.service.yml seperti yang ditentukan di sini

Namun, saya tidak dapat mengkonfigurasi pengaturan ini untuk memungkinkan akses layanan web melalui domain lain.

Pengaturan service.yml saya saat ini untuk cors adalah:

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

Saya googled untuk mencari konfigurasi terperinci lebih lanjut tentang ini tetapi tidak dapat menemukannya.

Saya membuat ini untuk pengembangan pengujian di dua domain yang berbeda.

Menggunakan lingkungan dev pantheon untuk layanan web dan domain .dev kustom hosting untuk menggunakan layanan tersebut.

Akses layanan berfungsi dengan baik menggunakan ekstensi chrome CORS.

Sarathkm
sumber
Jika Anda telah mengubah situs / default / services.yml Anda seperti yang dikatakan di jawaban sebelumnya, dan itu tidak berfungsi, pastikan CORS diaktifkan di server web Anda. Misalnya, di Nginx Anda harus menambahkan / memodifikasi lokasi di konfigurasi blok server Anda, lihat https://enable-cors.org/server_nginx.html
Pin

Jawaban:

16

Saya mengalami ini baru-baru ini di Pantheon, dan mudah-mudahan ini membantu jika Anda belum menyelesaikannya.

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

Beberapa hal yang perlu diperhatikan ...

Mengenai lokasi file di Pantheon, pastikan file service.yml Anda ada di / sites / default vs just / sites. Saya keliru di bawah kesan itu akan berhasil dari kedua tempat. Ini hanya akan berfungsi jika di direktori / sites / default.

Perhatikan daftar yang dipisahkan koma dariHeadHeaders masing-masing dalam set kutipan mereka sendiri. Saya awalnya memiliki string tunggal seperti yang Anda lakukan dalam contoh Anda di atas, dan gagal berkali-kali sebelum saya menangkap perbedaan yang halus. Saya cukup yakin metode diizinkan bekerja dengan cara yang sama jika Anda secara khusus ingin mencantumkan metode Anda.

Harap perhatikan juga bahwa sementara cuplikan kode saya akan bekerja dengan baik untuk pengembangan terhadap kotak pasir Pantheon, Anda mungkin ingin mengunci lebih banyak hal sebelum mulai berproduksi. Dengan Pantheon menawarkan HTTPS Anda juga ingin memastikan untuk menggunakannya jika Anda akan menyampaikan informasi melalui header. Semoga ini bisa membantu Anda jika Anda masih memiliki masalah atau orang lain yang tersandung di jalan.

Shawn Matthews
sumber
4
Mengapa tentukan allowOrigins dan kemudian meneruskan '*'?
Christian
Cukup untuk menunjukkan kedua opsi. Silakan hapus satu atau yang lainnya.
Shawn Matthews
exposedHeaders harus salah atau array, per drupal.org/project/drupal/issues/2905848
John
Jika ada yang tertarik, saya tidak percaya bahwa bidang yang diizinkan olehrigin menerima regex. Saya mencoba menggunakan pola regex untuk membuat daftar putih beberapa sub-domain, dan drupal mengeluh. Saya harus menggunakan daftar domain yang eksplisit, dipisahkan dengan koma, seperti dalam contoh ini. Saya berharap itu akan berperilaku seperti pengaturan host-terpercaya di settings.php
Tony Stecca
9

Temukan: ... / sites / default / default.services.yml

Buat salinan dan ganti nama salinan itu menjadi:

... / situs / default / services.yml

Temukan bagian kode ini: cors.config: enabled: false

dan ganti dengan yang berikut - cors.config: enabled: true

Bersihkan cache.

Soudip Paul
sumber
Saya seharusnya mencoba semuanya sampai melihat jawaban Anda, terima kasih telah menunjukkan poin paling penting yaitu MEMBERSIHKAN CACHE (REBUILD CACHE): D
emy
3

Pengaturan berikut ini berfungsi untuk saya.

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
sumber
0

exposedHeaders: true tidak valid dan akan menyebabkan Peringatan: implode (): Argumen yang tidak valid disahkan dalam Asm89 \ Stack \ CorsService-> addActualRequestHeaders () (baris 94 dari / vendor / asm89 / stack-cors / src / Asm89 / Stack / CorsService. php) # 0 /web/core/includes/bootstrap.inc(584) Perlu salah atau array dengan header yang diizinkan untuk mengekspos lihat https://developer.mozilla.org/en-US/docs/Web/ HTTP / Header / Access-Control-Expose-Header

Jagermonster
sumber