Wie können Sie eine CORS-Anfrage mit cURL debuggen?

300

Wie können Sie CORS-Anfragen mit cURL debuggen? Bisher konnte ich keine Möglichkeit finden, die Preflight-Anfrage zu "simulieren".

themihai
quelle

Antworten:

496

So können Sie CORS-Anforderungen mit curl debuggen.

Senden einer regulären CORS-Anfrage mit cUrl:

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

Das -H "Origin: http://example.com"Flag ist die Domain eines Drittanbieters, die die Anforderung stellt. Ersetzen Sie in welcher Domain auch immer.

Das --verboseFlag druckt die gesamte Antwort aus, sodass Sie die Anforderungs- und Antwortheader sehen können.

Die oben verwendete URL ist eine Beispielanforderung an eine Google-API, die CORS unterstützt. Sie können jedoch die von Ihnen getestete URL ersetzen.

Die Antwort sollte den Access-Control-Allow-OriginHeader enthalten.

Senden einer Preflight-Anfrage mit 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=

Dies ähnelt der regulären CORS-Anfrage mit einigen Ergänzungen:

Die -HFlags senden zusätzliche Preflight-Anforderungsheader an den Server

Das -X OPTIONSFlag zeigt an, dass dies eine HTTP OPTIONS-Anforderung ist.

Wenn die Preflight - Anforderung erfolgreich ist, sollte die Reaktion umfassen die Access-Control-Allow-Origin, Access-Control-Allow-Methodsund Access-Control-Allow-HeadersResponse - Header. Wenn die Preflight-Anforderung nicht erfolgreich war, sollten diese Header nicht angezeigt werden, oder die HTTP-Antwort lautet nicht 200.

Sie können auch zusätzliche Header angeben, z. B. User-Agentmithilfe des -HFlags.

Monsur
quelle
2
Diese Seite scheint keine CORS-Header zurückzugeben. Ist das richtig?
Janus Troelsen
1
Um die tatsächlichen Header anzuzeigen, müssen Sie die --verboseoben erwähnte Option hinzufügen .
Monsur
10
oder --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
John Bachir
2
Verwenden Sie --include, um die Überschriften anzuzeigen.
Mika Tuupola
7
Im Fall von S3 werden die entsprechenden Header nur hinzugefügt, wenn die richtige Methode angegeben ist. Sie können dies mit verwenden curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Joscha
52

Aktualisierte Antwort, die die meisten Fälle abdeckt

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Ersetzen Sie http://www.example.com/ durch die URL, die Sie testen möchten.
  2. Wenn die Antwort enthält, Access-Control-Allow-*unterstützt Ihre Ressource CORS.

Begründung für eine alternative Antwort

Ich google diese Frage ab und zu und die akzeptierte Antwort ist nie das, was ich brauche. Zuerst wird ein Antworttext gedruckt, der viel Text enthält. Hinzufügen von --headAusgaben nur Header. Zweitens müssen wir beim Testen von S3-URLs zusätzlichen Header bereitstellen -H "Access-Control-Request-Method: GET".

Hoffe das spart Zeit.

Vilius Paulauskas
quelle
2
Wenn ich mich kräusele, ohne den Ursprung festzulegen, und ich Antwort- und Header (einschließlich des Headers für die Zugriffskontrolle und den Ursprung zulassen) zurückerhalten kann, bedeutet dies, dass ich mein CORS falsch eingerichtet habe? curl -X GET ' endpoint.com ' -H 'Cache-Kontrolle: kein Cache' --head
Jun711
das gleiche herauszufinden @Jun
Lukas Lukac
1
Dies hängt davon ab, --headdass Curl die Überschriften ausdrucken lässt, aber es führt auch dazu, dass Curl HEADeher eine Anfrage als eine GET. Je nachdem, was Sie testen, möchten Sie möglicherweise eine GETAnfrage stellen. Sie können dies tun, indem Sie hinzufügen --IXGET.
Aidan Fitzpatrick
2
Ist das nicht rückwärts? Sollte der Ursprung nicht stattdessen example.com sein?
Dustin Ingram
4

Das Bash-Skript "corstest" unten funktioniert für mich. Es basiert auf Juns Kommentar oben.

Verwendung

corstest [-v] url

Beispiele

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

Das positive Ergebnis wird grün angezeigt

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

Das negative Ergebnis wird in rot und blau angezeigt

Die Option -v zeigt die vollständigen Curl-Header an

corstest

#!/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
quelle
Das Hinzufügen des Origin-Headers würde es besser machen, z. -H 'Herkunft: mydomain.xyz '
Bas
3

Scheint so, als ob genau das funktioniert:

curl -I http://example.com

Suchen Sie Access-Control-Allow-Origin: *in den zurückgegebenen Headern

MalcolmOcean
quelle
3
Denken Sie daran, dass *dies nicht funktioniert, wenn Anmeldeinformationen wie ein Cookie mit der API-Anforderung angezeigt werden müssen. In diesem Fall ist der FQDN auch in der Access-Control-Allow-OriginAntwort erforderlich Access-Control-Allow-Credentials: true. Anmeldeinformationen mit Anmeldeinformationen wurden von OP jedoch nicht als Anforderung angegeben und *funktionieren daher für nicht authentifizierte Anforderungen.
GameSalutes