Bagaimana Anda bisa men-debug permintaan CORS dengan cURL?

300

Bagaimana Anda bisa men-debug permintaan CORS menggunakan cURL? Sejauh ini saya tidak dapat menemukan cara untuk "mensimulasikan" permintaan preflight.

themihai
sumber

Jawaban:

496

Inilah cara Anda dapat men-debug permintaan CORS menggunakan curl.

Mengirim permintaan CORS biasa menggunakan cUrl:

curl -H "Origin: http://example.com" --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=

The -H "Origin: http://example.com"bendera adalah domain pihak ketiga membuat permintaan tersebut. Ganti dalam domain apa pun Anda.

The --verbosebendera print seluruh respon sehingga Anda dapat melihat permintaan dan respon header.

URL yang saya gunakan di atas adalah contoh permintaan ke Google API yang mendukung CORS, tetapi Anda dapat mengganti dengan url apa pun yang Anda uji.

Respons harus mencakup Access-Control-Allow-Origintajuk.

Mengirim permintaan preflight menggunakan cUrl:

curl -H "Origin: http://example.com" \
  -H "Access-Control-Request-Method: POST" \
  -H "Access-Control-Request-Headers: X-Requested-With" \
  -X OPTIONS --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=

Ini mirip dengan permintaan CORS biasa dengan beberapa tambahan:

The -Hbendera mengirim tambahan header permintaan preflight ke server

The -X OPTIONSflag mengindikasikan bahwa ini adalah permintaan PILIHAN HTTP.

Jika permintaan preflight berhasil, respon harus mencakup Access-Control-Allow-Origin, Access-Control-Allow-Methodsdan Access-Control-Allow-Headersheader respon. Jika permintaan preflight tidak berhasil, tajuk ini seharusnya tidak muncul, atau respons HTTP tidak akan 200.

Anda juga dapat menentukan tajuk tambahan, seperti User-Agent, dengan menggunakan -Hbendera.

monsur
sumber
2
halaman itu sepertinya tidak mengembalikan header CORS, apakah itu benar?
Janus Troelsen
1
Untuk melihat tajuk yang sebenarnya, Anda perlu menambahkan --verboseopsi, seperti yang disebutkan di atas.
monsur
10
atau --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
John Bachir
2
Gunakan --include untuk melihat header.
Mika Tuupola
7
Dalam kasus S3, header yang sesuai hanya ditambahkan jika metode yang tepat diberikan, Anda dapat melakukannya dengan menggunakan curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Joscha
52

Jawaban yang diperbarui mencakup sebagian besar kasus

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Ganti http://www.example.com/ dengan URL yang ingin Anda uji.
  2. Jika tanggapan menyertakan Access-Control-Allow-*maka sumber daya Anda mendukung CORS.

Dasar pemikiran untuk jawaban alternatif

Saya google pertanyaan ini setiap sekarang dan kemudian dan jawaban yang diterima tidak pernah saya butuhkan. Pertama, mencetak respons tubuh yang banyak teks. Menambahkan --headheader hanya keluaran. Kedua saat menguji URL S3, kami perlu memberikan tajuk tambahan -H "Access-Control-Request-Method: GET".

Semoga ini akan menghemat waktu.

Vilius Paulauskas
sumber
2
jika saya menggulung tanpa menyetel asal dan saya bisa mendapatkan respons dan tajuk (termasuk akses-kontrol-bolehkan tajuk asal) kembali, apakah itu berarti saya mengatur CORS saya secara salah? curl -X DAPATKAN ' endpoint.com ' -H 'Cache-Control: no-cache' --head
Jun711
mencari @Jun yang sama
Lukas Lukac
1
Ini bergantung pada --headmembuat ikal mencetak header, tetapi juga membuat ikal membuat HEADpermintaan daripada a GET. Bergantung pada apa yang Anda uji, Anda mungkin ingin mengajukan GETpermintaan. Anda dapat melakukan ini dengan menambahkan --IXGET.
Aidan Fitzpatrick
2
Bukankah ini terbalik? Bukankah seharusnya asalnya menjadi example.com?
Dustin Ingram
4

Skrip bash "corstest" di bawah ini berfungsi untuk saya. Itu berdasarkan komentar Jun di atas.

pemakaian

url corstest [-v]

contoh

./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *

hasil positif ditampilkan dalam warna hijau

./corstest https://github.com/IonicaBizau/jsonrequest
https://github.com/IonicaBizau/jsonrequest does not support CORS
you might want to visit https://enable-cors.org/ to find out how to enable CORS

hasil negatif ditampilkan dalam warna merah dan biru

opsi -v akan menampilkan header ikal penuh

terkuat

#!/bin/bash
# WF 2018-09-20
# https://stackoverflow.com/a/47609921/1497139

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'  
red='\033[0;31m'  
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}


#
# show the usage
#
usage() {
  echo "usage: [-v] $0 url"
  echo "  -v |--verbose: show curl result" 
  exit 1 
}

if [ $# -lt 1 ]
then
  usage
fi

# commandline option
while [  "$1" != ""  ]
do
  url=$1
  shift

  # optionally show usage
  case $url in      
    -v|--verbose)
       verbose=true;
       ;;          
  esac
done  


if [ "$verbose" = "true" ]
then
  curl -s -X GET $url -H 'Cache-Control: no-cache' --head 
fi
origin=$(curl -s -X GET $url -H 'Cache-Control: no-cache' --head | grep -i access-control)


if [ $? -eq 0 ]
then
  color_msg $green "$url $origin"
else
  color_msg $red "$url does not support CORS"
  color_msg $blue "you might want to visit https://enable-cors.org/ to find out how to enable CORS"
fi
Wolfgang Fahl
sumber
menambahkan header Asal akan membuatnya lebih baik e g. -H 'asal: mydomain.xyz '
Bas
3

Sepertinya ini hanya berfungsi:

curl -I http://example.com

Cari Access-Control-Allow-Origin: *di header yang dikembalikan

MalcolmOcean
sumber
3
Ingat itu *tidak berfungsi jika kredensial seperti cookie perlu disajikan dengan permintaan API. Dalam hal ini FQDN juga diperlukan dalam Access-Control-Allow-Originrespons Access-Control-Allow-Credentials: true. Permintaan yang dikreditkan meskipun tidak ditentukan sebagai persyaratan oleh OP, jadi *berfungsi untuk permintaan yang tidak diautentikasi.
GameSalutes