Jak można debugować żądanie CORS za pomocą cURL?

300

Jak można debugować żądania CORS za pomocą cURL? Do tej pory nie mogłem znaleźć sposobu na „symulację” żądania wstępnego.

themihai
źródło

Odpowiedzi:

496

Oto, w jaki sposób można debugować żądania CORS za pomocą curl.

Wysyłanie zwykłego żądania CORS za pomocą cUrl:

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

The -H "Origin: http://example.com"Flaga jest trzecia domena strona składająca wniosek. Zastępuj w jakiejkolwiek domenie.

The --verbose drukuje całej odpowiedzi flag, dzięki czemu można zobaczyć nagłówków żądania i odpowiedzi.

Adres URL, którego używam powyżej, jest przykładowym żądaniem do interfejsu API Google, który obsługuje CORS, ale możesz go zastąpić dowolnym testowanym adresem URL.

Odpowiedź powinna zawierać Access-Control-Allow-Originnagłówek.

Wysyłanie żądania inspekcji wstępnej za pomocą 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=

Wygląda podobnie do zwykłego żądania CORS z kilkoma dodatkami:

Te -Hflagi wysłać dodatkowe nagłówki żądania do serwera inspekcji wstępnej

-X OPTIONSFlaga wskazuje, że jest to żądanie HTTP OPTIONS.

Jeżeli wniosek inspekcji wstępnej jest udane, odpowiedź powinna zawierać Access-Control-Allow-Origin, Access-Control-Allow-Methodsoraz Access-Control-Allow-Headersnagłówki odpowiedzi. Jeśli żądanie inspekcji wstępnej nie powiodło się, nagłówki te nie powinny się pojawić lub odpowiedź HTTP nie będzie wynosić 200.

Możesz także określić dodatkowe nagłówki, na przykład User-Agentużywając -Hflagi.

monsur
źródło
2
ta strona nie wydaje żadnych nagłówków CORS, czy to prawda?
Janus Troelsen
1
Aby wyświetlić rzeczywiste nagłówki, musisz dodać --verboseopcję, jak wspomniano powyżej.
monsur
10
lub --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
John Bachir
2
Użyj --include, aby zobaczyć nagłówki.
Mika Tuupola,
7
W przypadku S3 odpowiednie nagłówki są dodawane tylko wtedy, gdy podana jest właściwa metoda, możesz to zrobić za pomocą curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Joscha
52

Zaktualizowana odpowiedź, która obejmuje większość przypadków

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Zamień http://www.example.com/ URL, który chcesz przetestować.
  2. Jeśli odpowiedź zawiera, oznacza Access-Control-Allow-*to, że Twój zasób obsługuje CORS.

Uzasadnienie alternatywnej odpowiedzi

Przeglądam to pytanie od czasu do czasu, a zaakceptowana odpowiedź nigdy nie jest tym, czego potrzebuję. Najpierw drukuje treść odpowiedzi, która jest dużą ilością tekstu. Dodawanie --headwyjść tylko nagłówki. Po drugie, podczas testowania adresów URL S3 musimy podać dodatkowy nagłówek-H "Access-Control-Request-Method: GET" .

Mam nadzieję, że pozwoli to zaoszczędzić czas.

Vilius Paulauskas
źródło
2
jeśli zwijam się bez ustawiania początku i mogę odzyskać odpowiedź i nagłówki (w tym nagłówek kontroli dostępu-zezwól na pochodzenie), czy to oznacza, że ​​źle ustawiłem CORS? curl -X GET ' endpoint.com ' -H 'Cache-Control: no-cache' --head
Jun711
wyobrażając to samo @ Jun
Lukas Lukac
1
Polega to na tym, --headże curl drukuje nagłówki, ale powoduje również, że curl wysyła HEADżądanie, a nie GET. W zależności od tego, co testujesz, możesz złożyć GETwniosek. Możesz to zrobić, dodając --IXGET.
Aidan Fitzpatrick,
2
Czy to nie jest wstecz? Czy pochodzenie nie powinno być example.com?
Dustin Ingram
4

Poniższy skrypt bash „najstraszniejszy” działa dla mnie. Opiera się na Jun powyższym komentarzu .

stosowanie

corstest [-v] url

przykłady

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

wynik dodatni jest wyświetlany na zielono

./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

wynik ujemny jest wyświetlany na czerwono i niebiesko

opcja -v pokaże pełne nagłówki zwijania

najstraszniejszy

#!/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
źródło
dodanie nagłówka Origin poprawiłoby np. -H „origin: mydomain.xyz
Bas
3

Wygląda na to, że to po prostu działa:

curl -I http://example.com

Poszukaj Access-Control-Allow-Origin: *w zwróconych nagłówkach

MalcolmOcean
źródło
3
Pamiętaj, że *to nie działa, jeśli poświadczenia, takie jak plik cookie, muszą zostać przedstawione wraz z żądaniem interfejsu API. W takim przypadku nazwa FQDN jest wymagana również w Access-Control-Allow-Originodpowiedzi Access-Control-Allow-Credentials: true. Żądania poświadczone, chociaż nie zostały określone przez OP, więc *działa w przypadku wszystkich nieuwierzytelnionych żądań.
GameSalutes