¿Cómo puede depurar una solicitud CORS con cURL?

300

¿Cómo puede depurar solicitudes CORS usando cURL? Hasta ahora no pude encontrar ninguna manera de "simular" la solicitud de verificación previa.

themihai
fuente

Respuestas:

496

A continuación, le mostramos cómo puede depurar las solicitudes CORS con curl.

Envío de una solicitud CORS regular utilizando cUrl:

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

La -H "Origin: http://example.com"bandera es el dominio de terceros que realiza la solicitud. Sustituir en cualquiera que sea su dominio.

El --verboseindicador imprime la respuesta completa para que pueda ver los encabezados de solicitud y respuesta.

La url que estoy usando anteriormente es una solicitud de muestra a una API de Google que admite CORS, pero puede sustituirla por la url que esté probando.

La respuesta debe incluir el Access-Control-Allow-Originencabezado.

Enviar una solicitud de verificación previa utilizando 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=

Esto se parece a la solicitud CORS normal con algunas adiciones:

Las -Hbanderas envían encabezados de solicitud de verificación previa adicionales al servidor

El -X OPTIONSindicador indica que se trata de una solicitud de OPCIONES HTTP.

Si la solicitud de verificación previa se realiza correctamente, la respuesta debe incluir las Access-Control-Allow-Origin, Access-Control-Allow-Methodsy Access-Control-Allow-Headerslas cabeceras de respuesta. Si la solicitud de verificación previa no tuvo éxito, estos encabezados no deberían aparecer o la respuesta HTTP no será 200.

También puede especificar encabezados adicionales, como User-Agent, mediante el uso de la -Hbandera.

Monsur
fuente
2
esa página no parece devolver ningún encabezado CORS, ¿es correcto?
Janus Troelsen
1
Para ver los encabezados reales, debe agregar la --verboseopción, como se mencionó anteriormente.
Monsur
10
o --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
John Bachir
2
Use --include para ver los encabezados.
Mika Tuupola
77
En el caso de S3, los encabezados correspondientes solo se agregan si se proporciona el método adecuado, puede hacerlo utilizando curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Joscha
52

Respuesta actualizada que cubre la mayoría de los casos

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Reemplace http://www.example.com/ con la URL que desea probar.
  2. Si la respuesta incluye, Access-Control-Allow-*entonces su recurso es compatible con CORS.

Justificación de una respuesta alternativa

Busco en Google esta pregunta de vez en cuando y la respuesta aceptada nunca es lo que necesito. Primero imprime el cuerpo de respuesta, que es mucho texto. Agregar --headsalidas solo encabezados. En segundo lugar, al probar las URL de S3, debemos proporcionar un encabezado adicional -H "Access-Control-Request-Method: GET".

Espero que esto ahorre tiempo.

Vilius Paulauskas
fuente
2
si me doblo sin configurar el origen y puedo obtener respuestas y encabezados (incluido el encabezado access-control-allow-origin), ¿eso significa que configuré mis CORS de manera incorrecta? curl -X GET ' endpoint.com ' -H 'Cache-Control: no-cache' --head
Jun711
imaginando lo mismo @Jun
Lukas Lukac
1
Esto se basa en --headhacer que curl imprima los encabezados, pero también hace que curl haga una HEADsolicitud en lugar de a GET. Dependiendo de lo que esté probando, es posible que desee hacer una GETsolicitud. Puedes hacer esto agregando --IXGET.
Aidan Fitzpatrick
2
¿No es esto al revés? ¿No debería ser el origen example.com en su lugar?
Dustin Ingram
4

El script bash "corstest" a continuación me funciona. Se basa en el comentario anterior de Jun .

uso

url de corstest [-v]

ejemplos

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

el resultado positivo se muestra en 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

el resultado negativo se muestra en rojo y azul

la opción -v mostrará los encabezados de rizo completo

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
fuente
agregar el encabezado Origin lo haría mejor e g. -H 'origen: midominio.xyz '
Bas
3

Parece que esto funciona:

curl -I http://example.com

Busque Access-Control-Allow-Origin: *en los encabezados devueltos

MalcolmOcean
fuente
3
Recuerde que *no funciona si las credenciales, como una cookie, deben presentarse con la solicitud de API. En ese caso, también se requiere el FQDN en la Access-Control-Allow-Originrespuesta Access-Control-Allow-Credentials: true. Las solicitudes con credenciales, aunque no fueron especificadas como un requisito por parte de OP, por lo que *funcionan para cualquier solicitud no autenticada.
GameSalutes