2017-02-03 9 views
1

次のAngular 2 HTTPリクエストがあります。角2 CORSの問題

const endpoint = '<auth_url>'; 
 
const body = { 
 
    prompt: 'consent', 
 
    grant_type: 'authorization_code', 
 
    redirect_uri: '<redirect_url>', 
 
    code: '<authorization_code>' 
 
}; 
 

 
const headers = new Headers(); 
 
headers.append('Authorization', 'Basic <auth>'); 
 
headers.append('Content-Type', 'application/x-www-form-urlencoded') 
 

 
const options = new RequestOptions({ headers }); 
 

 
this.http.post(endpoint, body, { headers: headers }) 
 
.map(res => res.json()) 
 
.subscribe(
 
    data => console.log(JSON.stringify(data)), 
 
    error => console.error(JSON.stringify(error)), 
 
() => console.log('Request complete') 
 
);

これはExpressJSインスタンスに添付されていますnode-oidc-providerに接続された要求が原因でプリフライトのサーバーにオプションとして終わるように、私が午前問題は、CORSです。上記のようにContent-Typeヘッダーを指定したので、これは当てはまりません。 Annoyingly私はこれがサーバーまたはAngular2コードの問題であるかどうかを判断しようとしていますか?

ExpressJSアプリケーションで明示的にCORSを有効にする必要がありますか?そうでない場合は、POSTで正しいヘッダーを設定しても効果がありません。

+1

のようになります方法です。 JSでできることは何もありません(Angularもできません)。場合によっては、JSONPを使用して作業することもできますが、それはかなり制限されています。 –

+0

ありがとう、以下の答えに私のコメントを参照してください – MindVox

答えて

2

はい、サーバー側でCORSを有効にする必要があります。つまり、サーバーを制御できるかどうかです。 はここであなたがコードからまたはWebServerの自体にこれらのヘッダを追加したい場合などのサーバーに関するいくつかの詳細を共有することができCORS

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET,POST,PUT,DELETE 
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept 

を有効にするには、サーバから返されるべきヘッダです。

POSTリクエストでヘッダーを設定しても効果がない理由についての質問については、ブラウザはXHTTPリクエストの前にOPTIONリクエストを発行し、CORSの受け入れに関するサーバーの許可を求める。

サーバー上で制御権がある場合は、前述のヘッダーを追加できます。そうでない場合、このチェックを克服するためにいくつかのブラウザプラグインを使用することができます。ここで

は、開発ツールでネットワーク]タブがCORSがサーバー上で設定する必要があります

enter image description here

+0

私はこのサーバーに私は期待される応答を取得し、 'Content-Type'ヘッダーを設定せずに、私はそのヘッダーを設定することができます希望の応答を得る。ノードアプリケーションはPhusionPassengerでNGINXインスタンスの背後にあるので、そこに追加することができます。奇妙なのは、このリクエストは前述の手法を使用して動作しますが、Angularでは使用できないということです。 – MindVox

+0

"ブラウザ"がプリフライトそのものを行っているので、角度からは機能しません。 curlまたはpostmanから、POSTリクエストは他のリクエストと同様にサーバーに直接送られます。 CORSチェックはブラウザによって課せられます。もちろん、固定ヘッダーとしてサーバーに直接追加することもできます。私の推奨は、より良い制御のためにコードからそれらを追加することです。 –

+0

セキュリティ上の理由から、ブラウザは、javascript内から開始されたクロスオリジンHTTPリクエストを制限します。ブラウザでAngularが実行されます:) – PierreDuc