मैं सैम (https://aws.amazon.com/serverless/ का उपयोग करके एक साधारण बैकएंड विकसित कर रहा हूं। सैम/ ) NodeJS और एक्सप्रेस।

मैं अपने टेम्पलेट के साथ sam cli का उपयोग करके स्टैक को परिनियोजित कर रहा हूं (क्लाउडफॉर्मेशन पर आधारित)। मुझे CORS समस्याओं से निपटने में बहुत परेशानी का सामना करना पड़ रहा है। मैं कुछ दिनों के लिए एक उत्तर की तलाश में हूं और मैंने कई समाधानों की कोशिश की है, असफल।

template.yml का हिस्सा, जहां मैं AWS::Serverless::Api को परिभाषित करता हूं:

Properties:
  Name: !Sub ${stackName}
  StageName: Web
  Cors:
    AllowHeaders: "'*'"
    AllowOrigin: "'*'"
    AllowMethods: "'*'"

app.js के अंदर मैंने रेखा को भी परिभाषित किया है

app.use(cors());

मैं पैकेज const awsServerlessExpress = require('@vendia/serverless-express') का उपयोग कर रहा हूं।

स्पष्ट रूप से, जब मैं पोस्टमैन या कर्ल के माध्यम से प्रत्येक एपीआई का परीक्षण करता हूं तो यह सही ढंग से काम करता है, जब मैं क्रोम (लोकलहोस्ट या कुछ अलग मेजबानों के साथ तैनात) पर एक ही परीक्षण करता हूं तो मुझे क्लासिक सीओआरएस त्रुटि मिलती है: ... has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

AWS ने CORS समस्याओं के निवारण के लिए एक गाइड रखा है, और यहाँ https ://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-test-cors.html कर्ल के साथ परीक्षण करने के लिए दिखाएं।

मैं इस तरह कर्ल के साथ एक ही परीक्षण करता हूं:

curl -v -X OPTIONS https://<endpoint>/auth/login -H "x-api-key: <API_KEY>" -H "Origin: https://127.0.0.1:3000" \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: Content-Type, Authorization

और जैसा कि मैं देख सकता हूं कि मुझे सीओआरएस हेडर सही तरीके से प्राप्त होते हैं:

Screen of cURL result

मुझे अभी भी समझ में नहीं आया कि क्रोम में मुझे CORS त्रुटि क्यों है।

अपडेट करें: मैंने x-api-key शीर्षलेख को छोड़कर उसी कर्ल अनुरोध का प्रयास किया है।

प्रतिक्रिया है: यहां छवि विवरण दर्ज करें

{"message":"Forbidden"}* Closing connection 0 के साथ

मैंने देखा है कि विकल्प अनुरोध में फ़ील्ड API कुंजी आवश्यक सत्य पर सेट है। मैंने इसे false पर सेट करने का प्रयास किया है लेकिन कर्ल परिणाम वही है।

1
sgrumo 3 अगस्त 2021, 15:53
1
आप कर्ल में परीक्षण कर रहे विकल्प अनुरोध से -H "x-api-key: <API_KEY>" को हटा दें। ऐसा इसलिए है क्योंकि ब्राउज़र में उस एक्स-एपीआई-कुंजी हेडर को प्रीफ्लाइट विकल्प कॉल में शामिल नहीं किया गया है - न ही इसमें कोई अन्य हेडर शामिल होगा जिसे आप अपने फ्रंटएंड जावास्क्रिप्ट कोड में सेट कर रहे होंगे। इसलिए, जिस सर्वर को अनुरोध भेजा जा रहा है उसे पूरी तरह से अनधिकृत विकल्प अनुरोधों को अनुमति देने के लिए कॉन्फ़िगर किया जाना चाहिए - किसी भी मूल से जिसे आप अनुमति देना चाहते हैं - और 200 OK सफलता प्रतिक्रिया के साथ उन विकल्प अनुरोधों का जवाब देना चाहिए। अनधिकृत विकल्प अनुरोध CORS प्रोटोकॉल की एक मूलभूत आवश्यकता है।
 – 
sideshowbarker
3 अगस्त 2021, 17:40
मैंने एक्स-एपीआई-कुंजी अनुरोध के बिना कर्ल अनुरोध का प्रयास किया है। एपीआई गेटवे एक्सेस-कंट्रोल-* हेडर नहीं भेजता है।
 – 
sgrumo
3 अगस्त 2021, 17:47

1 उत्तर

सबसे बढ़िया उत्तर

मुझे समस्या मिल गई है! मैं सभी एपीआई घटनाओं के लिए ApiKey आवश्यकताओं को निर्धारित किया था।

चूंकि विकल्प अनुरोध कोई प्रमाणीकरण शीर्षलेख नहीं भेजता है, इसलिए एपीआई गेटवे अनुरोध को अस्वीकार कर देता है ताकि ग्राहक को कभी भी सही विकल्प प्रतिक्रिया दिखाई न दे। मुझे लगता है कि यह सैम टेम्पलेट/क्लाउडफॉर्मेशन के साथ एक बग है

0
sgrumo 3 अगस्त 2021, 18:40