2017-06-11 15 views
6

CORSの投稿がたくさんあることを知っています。私はそれらに追加していますが、私を助ける答えは見つかりません。だから、私はphp apiに依存している角度4のアプリケーションを構築しています。CORS: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.

私:私は次のエラーを取得するために、ローカルの作業それは、私がapp.example.comでアプリ、およびapi.example.comのAPIを使用してドメインにそれを投げた瞬間は、私は私のログインを乗り越えることができない、大丈夫です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を気にしない郵便配達員による要求を、実行した場合、I GE T:

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

私はちょうどテストし、それが問題の核心だったかどうかを確認するために「*」に起源を設定しようとしました、そしてそれはまだ同じように失敗しました。

ただ、以下の情報から更新を編集 。ヘッダーのケーシングを変更しても効果はなく、ifステートメントからコードを引き出すことは効果がありませんでした。

私は自分のライブアプリに自分のローカルapiに行くようにPHPをデバッグし、PHPは期待どおりに動作しています。ヘッダーを設定し、それをそれぞれのifステートメントに入れます。

編集は、誰かが任意のアイデアを持っている場合、私は本当に私はそれを本当に感謝し、このいずれかでいくつかの助けを使用することができます2 を取ります。

編集は私が私の.htaccessではなく、私のPHPで全てのヘッダのものを設定した場合、それは私を経由することができます3 を取ります。しかし、今私は上記のエラーに悩まされていますが、実際には実際のサイトを使っています

{"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

if($ _SERVER ['REQUEST_METHOD'] == 'OPTIONS'){からコードを取り出して、何が起きたのかを確認します。 – MasoodUrRehman

+0

ブラウザのネットワークタブを調べることで、サーバーレスポンスのスナップショットを共有できますか?デバッガで – MasoodUrRehman

+0

応答]タブは空白ですが、ここではヘッダがあります - 応答: '許可:POST、OPTIONS、GET、HEAD、TRACE 接続:キープアライブ のContent-Length:0 のContent-Type:テキスト/平野 日:日、2017年6月11日二時41分43秒GMT キープアライブ:タイムアウト= 30 サーバー:Apacheが/ 2' 要求: '受け入れる:*/* 受け入れエンコード:gzipでは、 を収縮 アクセス制御要求ヘッダー:承認 アクセス制御要求メソッド:POST 接続:キープアライブ ホスト:api。試験ple.com 起源:http://app.example.com Referer:http:// app.example.com/login' – Nieminen

答えて

0

OK私は最近、同様の問題を持っていた私はありません.htaccessのものとバックエンド側ですべてを解決しました。

ブラウザがクロスサーバ要求を送信すると、最初にOPTIONS要求が送信され、有効であることを確認して「実際」の要求を送信できます。 OPTIONSから適切かつ有効な応答が得られた後、それだけが「本当の」要求を送信します。あなたは適切なヘッダを返すことを確認する必要があり、バックエンドの両方の要求のために今

:コンテンツタイプは、許可-起源を、許可、ヘッダ等...

はOPTIONSにに要求することを確認してくださいアプリはヘッダーを返して応答を返し、アプリのフルフローを続行しません。

「実際の」リクエストでは、適切なヘッダーと通常の応答本文を返す必要があります。

例:

  • を使用している場合:覚えて

    //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; 
        } 
    

    こと "とAccess-Control-Allow-Credentials" =真 は、アクセス制御は、許可する」ことを確認してください-Origin "は" * "ではなく、適切なドメインで設定する必要があります。 (血液の多くがここにこぼれた:/)

  • あなたが文句を言わないそれらを定義した場合、要求は

を失敗する あなたは、「アクセス制御 - 許可 - ヘッダ」になります許可ヘッダーを定義
+0

私はまだこれをテストすることはできませんが、それは正しいと思います。私は先に進んで答えを受け入れるので、期限が切れる前に賞金を得ることができます。ありがとう! – Nieminen

+0

ありがとう:)それが動作しない場合は、私たちがそれを解決するまでコメントしてください。私はちょうど1週間前にそれほど多くの時間を無駄にしたので、私はあなたに関係します。 –

+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"); 
関連する問題