CORS:資格情報フラグがtrueの場合、Access-Control-Allow-Originでワイルドカードを使用できません


296

私は関係するセットアップを持っています

フロントエンドサーバー(Node.js、ドメイン:localhost:3000)<--->バックエンド(Django、Ajax、ドメイン:localhost:8000)

ブラウザー<-webapp <-Node.js(アプリを提供)

ブラウザー(webapp)-> Ajax-> Django(ajax POSTリクエストを処理)

さて、ここでの私の問題は、webappがバックエンドサーバーへのAjax呼び出しを行うために使用するCORSセットアップにあります。クロムでは、私は得続けます

資格情報フラグがtrueの場合、Access-Control-Allow-Originでワイルドカードを使用できません。

Firefoxでも動作しません。

私のNode.jsセットアップは:

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
};

Djangoでは、このミドルウェアと 一緒に使用しています

Webアプリケーションは、次のようにリクエストを作成します。

$.ajax({
    type: "POST",
    url: 'http://localhost:8000/blah',
    data: {},
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true,
    dataType: 'json',
    success: successHandler
});

したがって、ウェブアプリが送信するリクエストヘッダーは次のようになります。

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"

そして、これが応答ヘッダーです:

Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json

どこがいけないの?!

編集1:私はを使用してきましたがchrome --disable-web-security、今は実際に機能する必要があります。

編集2:回答:

だから、私のdjango-cors-headers設定の解決策:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000' # Here was the problem indeed and it has to be http://localhost:3000, not http://localhost:3000/
)

1
私にとっては、httpなしのlocalhost:3000です。次のようになります。CORS_ORIGIN_WHITELIST =( 'localhost:3000'、)
Andrei

1台のPCでフロントエンドとバックエンドを開発して使用するということですか?
fanhualuojin154873

別のPCのフロントエンドとバックエンドはどうですか?
fanhualuojin154873

@ixaxaarなぜhttpでうまくいくのか?私たちはすべて '' localhost:3000'`だけが機能します。
244boy 2018年

@ 244boyええポイントは、httpではなく、それが/最後です。私はhttpを省略してもうまくいくと思いますが、ここ何年かは実際にこれに取り組んでいないので、何がうまくいくのか本当にわかりません!
ixaxaar 2018年

回答:


247

これはセキュリティの一部です。それはできません。資格情報を許可する場合Access-Control-Allow-Originは、を使用しないでください*。正確なプロトコル+ドメイン+ポートを指定する必要があります。参考のために、次の質問を参照してください。

  1. Access-Control-Allow-Originワイルドカードサブドメイン、ポート、プロトコル
  2. 資格情報を使用したクロスオリジンリソース共有

その*上、許容範囲が広すぎて、資格情報の使用を無効にします。そのため、http://localhost:3000またはhttp://localhost:8000許可元ヘッダーとして設定します。


45
しかし、複数のドメインがある場合はどうなりますか?
2014年

13
@arothドメインのリストを指定できます。関連質問:stackoverflow.com/questions/1653308/...
user568109

13
@ user568109「besides *は許容範囲が広すぎて、資格情報の使用を無効にする」と説明してくれませんか?
Hugo Wood

12
Cordovaで発生する可能性があるように、モバイルデバイスからのリクエストの場合、「正確なドメイン」とは何ですか?
クリスチャン、

8
@Christianは少し古いですが、まだ気になる人がいる場合、このエラーはブラウザで実行されているアプリケーションでのみ発生します。このエラーは、セキュリティ上の理由からブラウザによってスローされるためです。モバイルアプリ、郵便配達員、またはhttpクライアントを使用してリクエストを行うその他のバックエンドコードなどの他のクライアントでは、この問題は発生しないため、オリジンと正確なドメインについて心配する必要はありません。
Alisson

32

CORSミドルウェアを使用していて、withCredentialブール値true を送信する場合は、次のようにCORSを構成できます。

var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:3000'}));

16

使用している場合はexpress、使用することができますCORSをので、代わりにあなたのミドルウェアを書いているようにCORSを許可するようにパッケージ化。

var express = require('express')
, cors = require('cors')
, app = express();

app.use(cors());

app.get(function(req,res){ 
  res.send('hello');
});

12
ああ、今はもっと便利ですが、結果は同じです:(ところで、私は使用していますapp.use(cors({credentials: true}));
ixaxaar

1
テストされているこの Django CORSミドルウェアを調べてみてください。
ブルカン、2013年

1
2つのDjangoミドルウェアがありますか?django-cors-headerアプリのみを使用します。localhostCORS_ORIGIN_WHITELIST設定に追加CORS_ALLOW_CREDENTIALSし、True
Bulkan

1
ええ男、前にそれを試して無駄になりましたCORS_ORIGIN_ALLOW_ALL = TrueCORS_ORIGIN_WHITELIST = ( 'localhost' )そしてCORS_ALLOW_CREDENTIALS = True 私はこれらのヘッダーを取得しました:Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:3000/ Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE Content-Type: application/json
ixaxaar

5
このドキュメントを読んだ後:github.com/expressjs/corsuse iこの設定を使用:app.use(cors({credentials:true、origin: ' localhost:3001 '})); 私のために働いています。
allel

11

それを試してみてください:

const cors = require('cors')

const corsOptions = {
    origin: 'http://localhost:4200',
    credentials: true,

}
app.use(cors(corsOptions));

6

すべてのオリジンを許可し、認証情報をtrueにしたい場合、これは私にとってはうまくいきました:

app.use(cors({
  origin: function(origin, callback){
    return callback(null, true);
  },
  optionsSuccessStatus: 200,
  credentials: true
}));

@TSlegaitis Hahaええ、それがすべてのオリジンで機能するが、資格情報は保持する理由です。セキュリティの観点からはお勧めしませんが、機能します。
Squirrl

2

(編集)以前にお奨めアドオンもはや利用できません、あなたは試みることが、この他の1を


Chromeでの開発の目的で、このアドオンをインストールする と、その特定のエラーが解消されます。

Access to XMLHttpRequest at 'http://192.168.1.42:8080/sockjs-node/info?t=1546163388687' 
from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 
'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' 
when the request's credentials mode is 'include'. The credentials mode of requests 
initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

インストール後、アドオンIntercepted URLsCORS、緑または赤)のアイコンをクリックして適切なテキストボックスに入力し、URLパターンをに追加してください。ここで追加するURLパターンの例http://localhost:8080は、次のようになります。*://*


インストールした直後にわかりました。何かアイデアはありますか?
Jalil、

それは私のために働いた。他に同様のアドオンがある場合は、このアドオンを試す前にアンインストールする必要があります。
FilippoG

壊れたリンクを修正してください
Luk Aron、

元のアドオンが削除されたようで、上部に(編集)として新しい推奨事項を追加しました
エリエルマリモン

1

これは私にとって開発では機能しますが、本番環境では、まだ言及されていないがおそらく最善ではない、仕事を完了するための別の方法であることはお勧めできません。とにかくここに行きます:

リクエストからオリジンを取得し、それをレスポンスヘッダーで使用できます。以下は、それがエクスプレスでどのように見えるかです:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', req.header('origin') );
  next();
});

私はあなたのpythonセットアップでどのように見えるかわかりませんが、それは簡単に翻訳できるはずです。


Mozilla Dev Docsは、許可されたオリジンをリクエストからのものに変更するという考えを拡張しています。「Vary:Origin」HTTP応答ヘッダーとホワイトリスト許可ドメインを追加することをお勧めします。
Ramzis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.