आप CURL के साथ एक CORS अनुरोध को कैसे डिबग कर सकते हैं?


300

आप CURL का उपयोग करके CORS अनुरोधों को कैसे डीबग कर सकते हैं? अब तक मुझे प्रीफ़लाइट अनुरोध को "अनुकरण" करने का कोई तरीका नहीं मिला।

जवाबों:


496

यहां बताया गया है कि आप कर्ल का उपयोग करके कॉर्स अनुरोधों को कैसे डीबग कर सकते हैं।

CUrl का उपयोग करके एक नियमित CORS अनुरोध भेजना:

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

-H "Origin: http://example.com"झंडा तीसरे पक्ष के अनुरोध करने वाले डोमेन है। अपने डोमेन में जो कुछ भी हो, उसमें स्थान दें।

--verboseबाहर पूरे प्रतिक्रिया झंडा प्रिंट ताकि आप अनुरोध और प्रतिक्रिया हेडर देख सकते हैं।

मैं जिस url का उपयोग कर रहा हूं वह Google API का एक नमूना अनुरोध है जो 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झंडे सर्वर से अतिरिक्त preflight अनुरोध हेडर भेज

-X OPTIONSध्वज इंगित करता है कि यह एक HTTP विकल्प अनुरोध है।

Preflight अनुरोध सफल होता है, प्रतिक्रिया को शामिल करना चाहिए Access-Control-Allow-Origin, Access-Control-Allow-Methodsऔर Access-Control-Allow-Headersप्रतिक्रिया हेडर। यदि प्रीफ़लाइट अनुरोध सफल नहीं हुआ, तो ये शीर्ष लेख दिखाई नहीं देने चाहिए, या HTTP प्रतिसाद 200 नहीं होगा।

आप अतिरिक्त हेडर भी निर्दिष्ट कर सकते हैं, जैसे User-Agentकि -Hध्वज का उपयोग करके ।


2
वह पृष्ठ किसी भी कोर हेडर को वापस नहीं करता है, क्या यह सही है?
Janus Troelsen

1
वास्तविक हेडर देखने के लिए, आपको --verboseविकल्प जोड़ने की आवश्यकता है , जैसा कि ऊपर बताया गया है।
महाशय

10
या --head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
जॉन बाकिर

2
हेडर देखने के लिए --include का प्रयोग करें।
मिका तुपुला

7
एस 3 के मामले में, तदनुसार हेडर केवल जोड़े जाते हैं यदि उचित विधि दी गई है, तो आप उपयोग करके ऐसा कर सकते हैं 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 का समर्थन करता है।

वैकल्पिक उत्तर के लिए तर्क

मैं इस सवाल को हर अब और फिर Google को स्वीकार करता हूं और मुझे कभी भी इसकी आवश्यकता नहीं होती। सबसे पहले यह प्रतिक्रिया शरीर को प्रिंट करता है जो बहुत अधिक पाठ है। --headआउटपुट केवल हेडर जोड़ना । S3 URL का परीक्षण करते समय दूसरा हमें अतिरिक्त हेडर प्रदान करने की आवश्यकता है -H "Access-Control-Request-Method: GET"

उम्मीद है कि इससे समय की बचत होगी।


2
यदि मैं मूल स्थापित किए बिना कर्ल करता हूं और मुझे प्रतिक्रिया और हेडर मिल सकते हैं (एक्सेस-कंट्रोल-अनुमति-मूल हेडर सहित), तो क्या इसका मतलब है कि मैंने गलत तरीके से अपना कॉर्स सेट किया है? कर्ल -X ' endpoint.com ' -H 'कैश-कंट्रोल: नो-कैश'
हेड

उसी @ का पता लगाना
लुकास

1
यह --headहेडर को कर्ल प्रिंट आउट बनाने पर निर्भर करता है , लेकिन यह कर्ल ए के HEADबजाय अनुरोध भी करता है GET। आप जो परीक्षण कर रहे हैं, उसके आधार पर आप एक GETअनुरोध करना चाहते हैं। आप इसे जोड़कर कर सकते हैं --IXGET
एडन फिट्ज़पैट्रिक

2
क्या यह पीछे नहीं है? क्या इसके बजाय मूल example.com नहीं होना चाहिए?
डस्टिन इनग्राम

4

नीचे दी गई बाश स्क्रिप्ट "कोरस्टेस्ट" मेरे लिए काम करती है। यह ऊपर जून की टिप्पणी पर आधारित है।

प्रयोग

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

उत्पत्ति हेडर को जोड़ने से यह बेहतर होगा ई जी। -H 'मूल: mydomain.xyz '
बास

3

लगता है जैसे यह काम करता है:

curl -I http://example.com

के लिए देखो Access-Control-Allow-Origin: *वापस आए हेडर में


3
याद रखें कि *अगर एपीआई के अनुरोध के साथ कुकी को प्रस्तुत करने की आवश्यकता है तो यह काम नहीं करता है। उस स्थिति में FQDN Access-Control-Allow-Originप्रतिक्रिया के साथ-साथ आवश्यक है Access-Control-Allow-Credentials: true। क्रेडेंशियल अनुरोध हालांकि ओपी द्वारा एक आवश्यकता के रूप में निर्दिष्ट नहीं किए गए थे, इसलिए *किसी भी अनैतिक अनुरोध के लिए काम करता है।
गेमशूट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.