2017-06-11 6 views
6

की अनुमति दे रहा हूं इसलिए मुझे पता है कि वहाँ बहुत सी कोर पोस्ट हैं, और मैं उन्हें केवल जोड़ रहा हूं, लेकिन मुझे कोई जवाब नहीं मिल रहा है जो मेरी मदद करता है। तो मैं एक कोणीय 4 अनुप्रयोग का निर्माण कर रहा हूं जो मेरे PHP एपीआई पर निर्भर करता है। स्थानीय स्तर पर कार्य करना यह ठीक है, पल मैं इसे टॉस app.example.com पर अनुप्रयोग के साथ डोमेन पर है, और api.example.com पर एपीआई, मैं नहीं मेरा लॉगिन पिछले प्राप्त कर सकते हैं, क्योंकि मैं निम्नलिखित त्रुटि मिलती है:कोर: PHP: प्रीफलाइट अनुरोध का जवाब पास नहीं होता है। मैं मूल

XMLHttpRequest cannot load http://api.example.com/Account/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://app.example.com ' is therefore not allowed access.

मेरे php कोड इस तरह दिखता है:

$http_origin = $_SERVER['HTTP_ORIGIN']; 

$allowed_domains = array(
    'http://example.com', 
    'https://example.com', 
    'http://app.example.com', 
    'https://app.example.com', 
    'http://www.example.com', 
    'https://www.example.com' 
); 

if (in_array(strtolower($http_origin), $allowed_domains)) 
{ 
    // header("Access-Control-Allow-Origin: *"); 
    header("Access-Control-Allow-Origin: $http_origin"); 
    header('Access-Control-Allow-Credentials: true'); 
    header('Access-Control-Max-Age: 86400'); 
} 

// Access-Control headers are received during OPTIONS requests 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
     header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
     header("Access-Control-Allow-Headers: Authorization, Content-Type,Accept, Origin"); 
    exit(0); 
} 

मेरे कोणीय पोस्ट इस तरह दिखता है:

public login(login: Login): Observable<LoginResponse> { 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/x-www-form-urlencoded'); 
    headers.append('Authorization', 'Basic ' + btoa(login.Username + ':' + login.Password)); 
    return this.http.post(this.apiBaseUrl + '/Account/Login', "grant_type=client_credentials", { headers: headers }) 
     .map(response => { 
      // code 
     }); 
} 

अगर मैं डाकिया के माध्यम से अनुरोध है, जो CORS साथ परेशान नहीं करता है चलाने के लिए, मैं जीई टी:

{ "error": "invalid_client", "error_description": "Client credentials were not found in the headers or body" } 

मैं '*' के लिए मूल की स्थापना सिर्फ परीक्षण और देखते हैं कि यदि समस्या का मूल था, और यह अभी भी उसी तरह विफल रहता है की कोशिश की है।

संपादित बस नीचे जानकारी से अद्यतन करने। हेडर में बदलते आवरण का कोई प्रभाव नहीं पड़ा, और अगर उनके बयानों का कोई प्रभाव नहीं पड़ा तो कोड को खींच कर कोई प्रभाव नहीं पड़ा।

मैंने अपने स्थानीय ऐप पर जाने के लिए अपने लाइव ऐप को बताकर PHP को डीबग किया, और PHP उम्मीद के अनुसार काम कर रहा है। यह हेडर सेट कर रहा है और इसे प्रत्येक कथन में बना रहा है।

संपादित 2 ले मैं वास्तव में, इस पर कुछ मदद इस्तेमाल कर सकते हैं अगर किसी को किसी भी विचार है, मैं वास्तव में यह सराहनीय होगा।

संपादित ले 3 मैं अपने .htaccess बजाय मेरी php में सभी शीर्ष लेख सामान सेट करते हैं, यह मुझे के माध्यम से कर सकते हैं। हालांकि, अब मैं ऊपर सूचीबद्ध त्रुटि पर फंस गया हूं कि पोस्टमैन का उपयोग करते समय मुझे हमेशा मिलता है, हालांकि अब यह वास्तविक साइट का उपयोग करते समय है।

{"error":"invalid_client","error_description":"Client credentials were not found in the headers or body"}

मेरा जवाब हेडर तो

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:authorization, content-type, accept, origin 
Access-Control-Allow-Methods:GET, POST, OPTIONS 
Access-Control-Allow-Origin:* 

मैं इसे * करने के लिए केवल अपने डोमेन से बदलाव करने जा रहे एक बार मैं यह काम कर रहा है की तरह हैं। लेकिन अभी के लिए मैं इसे * के रूप में छोड़ दूंगा।

मेरे शीर्षलेख अनुरोध के रूप में।

Headers for failed request

+0

अगर ($ _SERVER ['REQUEST_METHOD'] == 'विकल्प') से कोड निकालें {और जांचें कि क्या हुआ। – MasoodUrRehman

+0

क्या आप ब्राउज़र में नेटवर्क टैब का निरीक्षण करके सर्वर प्रतिक्रिया का स्नैप शॉट साझा कर सकते हैं? – MasoodUrRehman

+0

डीबगर में प्रतिक्रिया टैब खाली है, लेकिन यहाँ है हेडर - प्रतिक्रिया: 'की अनुमति दें: पोस्ट, विकल्प प्राप्त, प्रमुख, ट्रेस कनेक्शन: जीवित-रखें सामग्री-लंबाई: 0 सामग्री प्रकार: पाठ/सादे तिथि: सूर्य, 11 जून 2017 02:41:43 GMT रखें-Alive: टाइमआउट = 30 सर्वर: अपाचे/2' अनुरोध: 'स्वीकार करें: */* Accept-Encoding: gzip, हवा निकालना स्वीकार्य भाषा: एन-यूएस, एन; क्यू = 0.8, सीए; क्यू = 0.6 एक्सेस-कंट्रोल-अनुरोध-हेडर: प्राधिकरण एक्सेस-कंट्रोल-अनुरोध-विधि: पोस्ट कनेक्शन: जीवित रहें होस्ट: एपीआई। परीक्षा ple.com उत्पत्ति: http: //app.example.com रेफरर: http: // app.example.com/login' – Nieminen

उत्तर

0

ठीक मैं एक इसी तरह के मुद्दों हाल ही में था और मैं केवल कोई .htaccess सामान के साथ बैकएंड तरफ सब कुछ हल किया।

जब ब्राउज़र क्रॉस सर्वर अनुरोध भेजता है तो पहले यह सुनिश्चित करने के लिए एक विकल्प अनुरोध भेजता है कि यह मान्य है और यह "असली" अनुरोध भेज सकता है। विकल्प के बाद से उचित और वैध प्रतिक्रिया प्राप्त होने के बाद, केवल तभी यह "असली" अनुरोध भेजता है।

अब बैकएंड आप उचित हेडर वापस जाने के लिए सुनिश्चित करने की आवश्यकता पर दोनों के अनुरोध के लिए: सामग्री-प्रकार, अनुमति देने के मूल के, अनुमति देते हैं-हेडर आदि ...

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

"वास्तविक" अनुरोध में, आपको उचित शीर्षलेख और नियमित प्रतिक्रिया निकाय वापस करना चाहिए।

उदाहरण:

//The Response object 
    $res = $app->response; 

    $res->headers->set('Content-Type', 'application/json'); 
    $res->headers->set('Access-Control-Allow-Origin', 'http://example.com'); 
    $res->headers->set('Access-Control-Allow-Credentials', 'true'); 
    $res->headers->set('Access-Control-Max-Age', '60'); 
    $res->headers->set('Access-Control-Allow-Headers', 'AccountKey,x-requested-with, Content-Type, origin, authorization, accept, client-security-token, host, date, cookie, cookie2'); 
    $res->headers->set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); 

    if (! $req->isOptions()) { 
     // this continues the normal flow of the app, and will return the proper body 
     $this->next->call(); 
    } else { 
     //stops the app, and sends the response 
     return $res; 
    } 

याद रखने वाली बातें:

  • यदि आप उपयोग कर रहे हैं: "पहुंच-नियंत्रण-अनुमति दें-क्रेडेंशियल" = सच सुनिश्चित करें कि "पहुंच-नियंत्रण-अनुमति दें बनाना -ऑरिगिन "नहीं है" * ", यह एक उचित डोमेन के साथ सेट किया जाना चाहिए! (रक्त का एक बहुत यहाँ गिरा था: /)

  • अनुमति हेडर आप में मिल जाएगा परिभाषित "पहुंच-नियंत्रण--हेडर की अनुमति दें" अगर आप अभ्यस्त उन्हें परिभाषित, अनुरोध असफल हो जायेगी

+0

मैं अभी तक इसका परीक्षण नहीं कर सकता, लेकिन यह सही लगता है। मैं आगे बढ़ने जा रहा हूं और जवाब स्वीकार कर रहा हूं ताकि आप इसे समाप्त होने से पहले बक्षीस प्राप्त कर सकें। धन्यवाद! – Nieminen

+0

धन्यवाद :) अगर यह काम नहीं करता है, तो कृपया इसे हल करने तक टिप्पणी करें। मैंने बस एक हफ्ते पहले इतना समय बर्बाद कर दिया था, इसलिए मैं आपसे संबंधित हूं –

+0

क्या आप मेरे लिए एक संबंधित मुद्दे पर विचार करेंगे? https://stackoverflow.com/questions/44751329/php-cors-oauth2-bearer-token-authorization-issues – Nieminen

0

मैंने नीचे php में जोड़ा और यह मेरी समस्या हल हो गई।

header("Access-Control-Allow-Origin: *"); 

header("Access-Control-Allow-Headers: Content-Type, origin"); 
संबंधित मुद्दे