Come si può eseguire il debug di una richiesta CORS con cURL?


300

Come è possibile eseguire il debug delle richieste CORS utilizzando cURL? Finora non sono riuscito a trovare alcun modo per "simulare" la richiesta di verifica preliminare.

Risposte:


496

Ecco come è possibile eseguire il debug delle richieste CORS usando curl.

Invio di una normale richiesta CORS utilizzando cUrl:

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

Il -H "Origin: http://example.com"flag è il dominio di terze parti che effettua la richiesta. Sostituisci qualunque sia il tuo dominio.

Il --verboseflag stampa l'intera risposta in modo da poter vedere le intestazioni di richiesta e risposta.

L'URL che sto usando sopra è una richiesta di esempio a un'API di Google che supporta CORS, ma puoi sostituire qualsiasi url che stai testando.

La risposta dovrebbe includere l' Access-Control-Allow-Originintestazione.

Invio di una richiesta di verifica preliminare utilizzando 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=

Sembra simile alla normale richiesta CORS con alcune aggiunte:

I -Hflag inviano ulteriori intestazioni di richiesta di preflight al server

Il -X OPTIONSflag indica che si tratta di una richiesta OPZIONI HTTP.

Se la richiesta di verifica preliminare è successo, la risposta dovrebbe includere i Access-Control-Allow-Origin, Access-Control-Allow-Methodse Access-Control-Allow-Headersintestazioni di risposta. Se la richiesta di verifica preliminare non ha avuto esito positivo, queste intestazioni non dovrebbero apparire o la risposta HTTP non sarà 200.

Puoi anche specificare intestazioni aggiuntive, ad esempio User-Agent, usando il -Hflag.


2
quella pagina non sembra restituire alcuna intestazione CORS, è corretto?
Janus Troelsen,

1
Per visualizzare le intestazioni effettive, è necessario aggiungere l' --verboseopzione, come indicato sopra.
mons

10
oppure --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
John Bachir,

2
Usa --include per vedere le intestazioni.
Mika Tuupola,

7
Nel caso di S3, le intestazioni corrispondenti vengono aggiunte solo se viene fornito il metodo corretto, è possibile farlo utilizzando curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Joscha

52

Risposta aggiornata che copre la maggior parte dei casi

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Sostituisci http://www.example.com/ con l'URL che desideri testare.
  2. Se la risposta include, la Access-Control-Allow-*tua risorsa supporta CORS.

Razionale per una risposta alternativa

Ogni tanto google questa domanda e la risposta accettata non è mai ciò di cui ho bisogno. Prima stampa il corpo della risposta che è molto testo. Aggiunta di --headoutput solo intestazioni. In secondo luogo, quando testiamo gli URL S3, dobbiamo fornire un'intestazione aggiuntiva -H "Access-Control-Request-Method: GET".

Spero che questo ti farà risparmiare tempo.


2
se si arricciano senza impostare l'origine e posso ottenere risposta e intestazioni (inclusa l'intestazione access-control-allow-origin), significa che ho impostato il mio CORS in modo errato? curl -X OTTIENI ' endpoint.com ' -H 'Cache-Control: no-cache' --head
Jun711

immaginando lo stesso @Jun
Lukas

1
Questo si basa sul --headfare arricciare la stampa delle intestazioni, ma fa anche arricciare una HEADrichiesta piuttosto che un GET. A seconda di ciò che stai testando, potresti voler fare una GETrichiesta. Puoi farlo aggiungendo --IXGET.
Aidan Fitzpatrick,

2
Non è questo al contrario? L'origine non dovrebbe essere esempio.com?
Dustin Ingram,

4

Lo script bash "corstest" qui sotto funziona per me. Si basa sul commento di Jun sopra.

uso

corstest [-v] url

esempi

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

il risultato positivo viene visualizzato in verde

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

il risultato negativo viene visualizzato in rosso e blu

l'opzione -v mostrerà le intestazioni di arricciatura complete

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

aggiungendo l'intestazione Origin sarebbe meglio e g. -H 'origine: mydomain.xyz '
Bas

3

Sembra proprio che funzioni:

curl -I http://example.com

Cerca Access-Control-Allow-Origin: *nelle intestazioni restituite


3
Ricorda che *non funziona se è necessario presentare credenziali come un cookie con la richiesta API. In tal caso, nella Access-Control-Allow-Originrisposta è richiesto anche il nome di dominio completo (FQDN) Access-Control-Allow-Credentials: true. Le richieste con credenziali, sebbene non siano state specificate come un requisito dall'OP, quindi *funzionano per qualsiasi richiesta non autenticata.
GameSalutes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.