2015-12-23 14 views
8

काम करता है मैं अपने कोणीय लॉगिन सेवा से पोस्ट करने की कोशिश:कोणीय पोस्ट पार मूल त्रुटि डाकिया

$http.post('https://xyz/login', 
      { 
       headers: { 
        'Content-type': 'application/json', 
        'Accept': 'application/json', 
        'signature': 'asd' 
       } 

और मैं इस त्रुटि मिलती है:

$httpProvider.defaults.useXDomain = true; 
delete $httpProvider.defaults.headers.common['X-Requested-With']; 
:

XMLHttpRequest cannot load https://xyz/login. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:1337' is therefore not allowed access. 

मैं इस हेडर की कोशिश की

और ये भी:

"Access-Control-Allow-Origin": "*"; 
"Access-Control-Allow-Headers": "X-Requested-With"; 
"Access-Control-Allow-Methods": "GET, POST", "PUT", "DELETE"; 

दिलचस्प बात यह है कि POSTMAN काम करता है। मुझे क्या करना है?

धन्यवाद।

+0

क्या आपके पास अपने सर्वर पर CORS सक्षम है? विवरण – heavyhorse

+0

हे के लिए कृपया http://enable-cors.org/ देखें। यह मेरा सर्वर नहीं है, यह एक बाहरी सेवा है। मुझे लगता है कि कॉर्स सक्षम हैं क्योंकि मुझे POSTMAN – user3712353

+1

द्वारा प्रतिक्रिया मिल सकती है POSTMAN सामान्य वेब संदर्भ नहीं चलाता है और यह समान मूल नीति के अधीन नहीं है। देखें [समान उत्पत्ति नीति ब्राउज़र एक्सटेंशन पर कैसे लागू होती है?] (Http://stackoverflow.com/questions/11849945/how-does-same-origin-policy-apply-to-browser-extensions/11850557#11850557) – apsillers

उत्तर

5

आपके अनुरोध में गैर-सरल शीर्षलेख Content-type और signature शामिल हैं जिन्हें प्रतिक्रिया Access-Control-Allow-Headers शीर्षलेख में शामिल किया जाना चाहिए।

(Content-type कभी कभी एक साधारण शीर्षक है, लेकिन केवल विशेष मूल्यों के लिए। application/json उन मूल्यों में से एक नहीं है, और यह Content-type का कारण बनता है गैर सरल हो गया है।)

अपने सर्वर की preflight जवाब में Access-Control-Allow-Headers को Content-type जोड़े ।

POSTMAN एक ही मूल नीति से बंधे नहीं है, इसलिए इसे सर्वर से CORS समर्थन की आवश्यकता नहीं है।

+0

दिलचस्प इस अंतर्दृष्टि के लिए धन्यवाद, इस मामले में हस्ताक्षर की आवश्यकता भी है? – danday74

+0

अभी भी वही है। मैंने इसे अपने कोणीय ऐप कॉन्फ़िगरेशन में जोड़ा: '$ httpProvider.defaults.useXDomain = true; $ httpProvider.defaults.headers.common ['एक्स-अनुरोधित-साथ'] हटाएं; $ httpProvider.defaults.headers.common ['एक्सेस-कंट्रोल-स्वीट-हेडर'] = '*'; $ httpProvider.defaults.headers.common ['एक्सेस-कंट्रोल-अनुमति-उत्पत्ति'] = '*'; $ httpProvider.defaults.headers.common ['एक्सेस-कंट्रोल-स्वीट-मेथड'] = '*'; ' – user3712353

+0

@ user3712353 ओह, मुझे लगता है कि बाद में कोड स्निपेट आपके सर्वर-साइड कोड पर चल रहे थे। आपको * सर्वर * सही कोरस हेडर भेजने की आवश्यकता है। – apsillers

2

क्या आपका ब्राउज़र पोस्ट करने से पहले एक विकल्प अनुरोध कर रहा है? नेट टैब मैं मुद्दों लिया है जहां पहले एक विकल्प अनुरोध ब्राउज़र या कोणीय (जो पता नहीं है) द्वारा किया जा रहा था और सर्वर नहीं था ...

"पहुंच-नियंत्रण-अनुमति दें चेक -मात्र ":" प्राप्त करें, पोस्ट करें "," पुट "," हटाएं "," विकल्प ";

+0

अरे। जैसा कि आप देख सकते हैं, मैंने तरीकों के लिए '*' जोड़ा। यह अभी भी काम नहीं कर रहा है। – user3712353

+0

ठीक है आपके नोड कोड में हेडर को डंप करें कि POSTMAN ब्राउज़र द्वारा उपयोग किए गए हेडर का उपयोग कर रहा है और डंप कर रहा है और दो की तुलना करें और उन्हें काम करने वाली कॉन्फ़िगरेशन पर आज़माएं और संरेखित करें! मुझे कोणीय शीर्षलेख मिलेंगे और पोस्टमैन में भी उनका इस्तेमाल करेंगे और देखें कि यह विफल रहता है या नहीं। पता लगाएं कि कौन सा हेडर एक समय में उन्हें हटाकर समस्या का कारण बन रहा है। आप केवल नेटर्स टैबलेट से हेडर प्राप्त कर सकते हैं और फिर उन्हें POSTMAN अनुरोध पर कॉपी कर सकते हैं, फिर उन्हें एक बार – danday74

+0

पर निकालना शुरू करें, जो सेवा मैं पोस्ट करता हूं वह मेरा नहीं है, यह प्रमाणीकरण के लिए बाहरी सेवा है। मुझे नहीं पता कि मुझे कोणीय कोड में क्या बदलना चाहिए, और हां, यह विकल्प – user3712353

0

सुनिश्चित नहीं है कि आपके पास पहले से ही आवश्यक जानकारी है या नहीं।

हेडर: {मेजबान: - लेकिन अपने स्थानीय वेब सर्वर में जब मैं यहाँ डाकिया का उपयोग कर एक http अनुरोध बनाने के लिए क्या यह शीर्ष लेख में जोड़ता है 'स्थानीय होस्ट', कनेक्शन: 'जीवित-रखें', pragma : 'नो-कैश', 'कैश-कंट्रोल': 'नो-कैश', 'उपयोगकर्ता-एजेंट': 'मोज़िला/5.0 (विंडोज एनटी 10.0; WOW64) ऐप्पलवेबकिट/537.36 (केएचटीएम, जैसे गीको) क्रोम/47.0 .2526.106 सफारी/537.36 ', स्वीकार करते हैं:' / ', संदर्भित:' http://localhost/ ', ' स्वीकार एन्कोडिंग ':', 'gzip, हवा निकालना, sdch स्वीकार-भाषा': 'en-US, एन; क्यू = 0.8 '},

[ 'होस्ट', 'स्थानीय होस्ट', 'कनेक्शन', 'जीवित-रखें', 'Pragma', 'कोई कैश', ':

और यहाँ है कि मैं क्या rawHeaders में देखते हैं कैश-कंट्रोल ', ' नो-कैश ', ' उपयोगकर्ता-एजेंट ', ' मोज़िला/5.0 (विंडोज एनटी 10.0; WOW64) AppleWebKit/537.36 (केएचटीएम, जैसे गेको) क्रोम/47.0.2526.106 सफारी/537।36 ', ' स्वीकार करें ' ' / ', ' Referer ', ' http://localhost/ ', ', 'स्वीकार-एन्कोडिंग', 'gzip, हवा निकालना, sdch स्वीकार करें-भाषा', ' एन-यूएस, एन; क्यू = 0.8 '],

तो शायद आपको अपने ग्राहक को एक मान्यता प्राप्त ब्राउज़र क्लाइंट होने के लिए नकली करने की आवश्यकता है।

+0

अरे। मुझे समझ में नहीं आता, यह वही हैडर है। – user3712353

+0

मेरा मतलब है कि मुझे लगता है कि आपको अपने कोड में ऐसा कुछ डालना होगा: var headers = {host: 'localhost', कनेक्शन: 'keep-live', pragma: 'no-cache', 'कैश-कंट्रोल' : 'नो-कैश', 'उपयोगकर्ता-एजेंट': 'मोज़िला/5.0 (विंडोज एनटी 10.0; WOW64) ऐप्पलवेबकिट/537.36 (केएचटीएम, जैसे गेको) क्रोम/47.0.2526.106 सफारी/537.36', स्वीकार करें: '/', रेफरर : 'http: // localhost /', 'स्वीकार-एन्कोडिंग': 'gzip, deflate, sdch', 'स्वीकार-भाषा': 'en-US, en; q = 0।8 '}; वर विकल्प = { मेजबान: 'स्थानीय होस्ट', पथ: '/', पोर्ट: '80', हेडर: हेडर }; var req = http.request (विकल्प, कॉलबैक); – Tim

+0

सोचें कि मैंने अभी इस मुद्दे को महसूस किया होगा - मैंने अभी एसएसएल/टीएलएस (https के माध्यम से) का उपयोग करने की कोशिश की है। मुझे नहीं लगता कि यह काम करेगा यदि आप एक ब्राउज़र क्लाइंट के भीतर कोणीय जेएस का उपयोग कर रहे हैं जो विभिन्न वेबसाइट पर इंगित कर रहा है। मेरा मानना ​​है कि यह एक सुरक्षा प्रतिबंध हो सकता है: https://docs.angularjs.org/api/ng/service/$http#cross-site-request-forgery-xsrf-protection आप प्रयास कर रहे हैं एक ही साइट के लिए एक पोस्ट प्रदर्शन करने के लिए - पूर्ण डोमेन/मेजबान अवश्य लगा दें नहीं है: https: // xyz/लॉगिन सिर्फ पथ का उपयोग करें: "प्रवेश /" या "लॉगिन" – Tim

संबंधित मुद्दे