it-swarm.com.de

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

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

253
themihai

Hier erfahren Sie, wie Sie CORS-Anforderungen mit curl debuggen können.

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 des Drittanbieters, die die Anfrage gestellt hat. Ersetzen Sie in was auch immer Ihre Domain ist.

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

Die URL, die ich oben verwende, ist eine Beispielanforderung an eine Google-API, die CORS unterstützt. Sie können sie jedoch durch eine beliebige URL ersetzen, die Sie testen.

Die Antwort sollte das Access-Control-Allow-Origin Header.

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 ein paar Ergänzungen:

Das -H Flags senden zusätzliche Preflight-Anforderungsheader an den Server

Das -X OPTIONS Flag zeigt an, dass es sich um eine HTTP OPTIONS-Anforderung handelt.

Wenn die Preflight-Anforderung erfolgreich ist, sollte die Antwort das Access-Control-Allow-Origin, Access-Control-Allow-Methods, und Access-Control-Allow-Headers Antwortheader. 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 Überschriften angeben, z. B. User-Agent, mit dem -H Flagge.

429
monsur

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: // localhost durch die URL, die Sie testen möchten.
  2. Wenn die Antwort Access-Control-Allow-* Enthält, unterstützt Ihre Ressource CORS.

Begründung für die alternative Antwort

Ich google diese Frage immer mal wieder und die akzeptierte Antwort ist nie das, was ich brauche. Zuerst wird der Antworttext gedruckt, der viel Text enthält. Das Hinzufügen von ---head Gibt nur Header aus. Zweitens müssen wir beim Testen von S3-URLs einen zusätzlichen Header -H "Access-Control-Request-Method: GET" Bereitstellen.

Hoffe das spart Zeit.

37

Scheint so:

curl -I http://example.com

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

3
MalcolmOcean

Das unten stehende Bash-Skript "corstest" funktioniert für mich. Es basiert auf Jun's Kommentar oben.

Nutzung

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 in 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 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
1
Wolfgang Fahl