Як можна налагодити запит CORS за допомогою CURL?


300

Як можна налагоджувати CORS-запити за допомогою CURL? Поки що я не міг знайти жодного способу "імітувати" запит перед польотом.

Відповіді:


496

Ось як можна налагоджувати CORS-запити за допомогою curl.

Надсилання звичайного запиту CORS за допомогою cUrl:

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

-H "Origin: http://example.com"Прапор є домен третьої сторони робить запит. Замініть будь-який ваш домен.

В --verboseпрапор виводить весь відповідь , так що ви можете побачити заголовки запиту і відповіді.

URL-адреса, яку я використовую вище, - це зразок запиту до API Google, який підтримує CORS, але ви можете замінити будь-яку URL-адресу, яку ви тестуєте.

Відповідь повинна містити Access-Control-Allow-Originзаголовок.

Надсилання запиту на попередній політ за допомогою 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=

Це схоже на звичайний запит CORS з кількома доповненнями:

Ці -Hпрапори відправити додаткові предполітних заголовки запиту до сервера

-X OPTIONSПрапор вказує на те, що це запит HTTP OPTIONS.

Якщо передпольотної запит успішний, відповідь має включати в себе Access-Control-Allow-Origin, Access-Control-Allow-Methodsі Access-Control-Allow-Headersзаголовки відповіді. Якщо запит перед польотом не вдався, ці заголовки не повинні з’являтися, або відповідь HTTP не буде 200.

Ви також можете вказати додаткові заголовки, наприклад User-Agent, використовуючи -Hпрапор.


2
ця сторінка не повертає жодних заголовків CORS, чи правильно це?
Janus Troelsen

1
Щоб переглянути фактичні заголовки, вам потрібно додати --verboseпараметр, як було зазначено вище.
монсур

10
або --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
Іван Бачир

2
Використовуйте --включіть, щоб побачити заголовки.
Міка Туупола

7
У випадку з S3 відповідні заголовки додаються лише за умови правильного методу, ви можете зробити це за допомогою curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file.
Джоша

52

Оновлена ​​відповідь, яка охоплює більшість випадків

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Замініть http://www.example.com/ URL-адресою, яку ви хочете перевірити.
  2. Якщо відповідь включає, Access-Control-Allow-*то ваш ресурс підтримує CORS.

Обґрунтування альтернативної відповіді

Час від часу я гуглю цим питанням, і прийнята відповідь - це ніколи те, що мені потрібно. Спочатку він друкує орган відповіді, який містить багато тексту. Додавання --headвиходів лише заголовків. По-друге, при тестуванні URL-адрес S3 нам потрібно надати додатковий заголовок -H "Access-Control-Request-Method: GET".

Сподіваюся, це заощадить час.


2
якщо я згортаюсь без встановлення джерела, і я можу отримати відповідь і заголовки (включаючи заголовок-контроль дозволу-вихідного коду) назад, це означає, що я неправильно налаштував свій CORS? curl -X GET ' endpoint.com ' -H 'Кеш-контроль: no-cache'
--head

з'ясувати те саме @Jun
Лукаш Лукач

1
Це покладається на те, --headщоб викрутити заголовки для завитків, але це також змушує curl зробити HEADзапит, а не a GET. Залежно від тестування ви можете зробити GETзапит. Це можна зробити, додавши --IXGET.
Айдан Фіцпатрік

2
Хіба це не назад? Чи не слід натомість походження бути example.com?
Дастін Інграм

4

Баш сценарій "corstest" нижче працює для мене. Він заснований на коментарі Джуна вище.

використання

corstest [-v] URL

приклади

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

позитивний результат відображається зеленим кольором

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

негативний результат відображається червоним та синім кольором

опція -v покаже повні заголовки завитка

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

додавання заголовка Origin полегшить його. -H 'походження: mydomain.xyz '
Bas

3

Схоже, що це працює:

curl -I http://example.com

Шукайте Access-Control-Allow-Origin: *у повернених заголовках


3
Пам’ятайте, що *це не працює, якщо такі запити, як cookie, потрібно подати із запитом API. У цьому випадку FQDN також потрібен у Access-Control-Allow-Originвідповіді Access-Control-Allow-Credentials: true. Хоча сертифіковані запити не були визначені як вимога ОП, тому *працює для будь-яких несанкціонованих запитів.
GameSalutes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.