web-dev-qa-db-ja.com

nodejsで複数のドメインのAccess-Control-Allow-Originを有効にします

Node.jsでCORSを許可しようとしていますが、問題は_*_が設定されている場合、_Access-Control-Allow-Origin_を_Access-Control-Allow-Credentials_に設定できないことです。

また、仕様では、_Access-Control-Allow-Origin_の配列またはコンマ区切りの値を実行できないと記載されており、推奨される方法はこれに似たものを実行することです Access-Control-Allow-Origin Multiple Origin Domains? =

しかし、私はnode.jsでこのように行うことはできないようです

_["http://mydomain.com:9001", "http://mydomain.com:5001"].map(function(domain) {
  res.setHeader( "Access-Control-Allow-Origin", domain );
});
res.header( "Access-Control-Allow-Credentials", true );
_

ここでの問題は、配列の最後の値によってオーバーライドされるため、ヘッダーがres.setHeader( "Access-Control-Allow-Origin", "http://mydomain.com:5001" );に設定されることです。

クライアントブラウザからのエラー:

XMLHttpRequestはロードできません http://mydomain.com:9090/api/sync 。 「Access-Control-Allow-Origin」ヘッダーの値は「 http://mydomain.com:5001 」であり、指定されたOriginと等しくありません。したがって、オリジン ' http://mydomain.com:9001 'はアクセスを許可されていません。

58
Ali

以下は、複数のオリジンを許可するためにエクスプレスアプリケーションで使用するものです

app.use(function(req, res, next) {
  var allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000'];
  var Origin = req.headers.Origin;
  if(allowedOrigins.indexOf(Origin) > -1){
       res.setHeader('Access-Control-Allow-Origin', Origin);
  }
  //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020');
  res.header('Access-Control-Allow-Methods', 'GET, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.header('Access-Control-Allow-Credentials', true);
  return next();
});
149
Chandru

これが遅れるかどうかはわかりませんが、次を設定して解決しました:res.setHeader("Access-Control-Allow-Origin", req.headers.Origin);

これにより、ヘッダーとしてすべての接続が許可されます。すべてのクエリで送信されます。

Req.headers.Originがホワイトリストに登録されたドメイン(ハードコーディングされた配列から)であるかどうかをチェックし、配列に存在する場合はこのドメインを返す関数を作成することができます。

10
Matt

ホワイトリストを、req.headers.Originなどと比較します。

var origins = ['a.com', 'b.com', 'c.com', 'boobies.com'];
for(var i=0;i<origins.length;i++){
    var Origin = origins[i];
    if(req.headers.Origin.indexOf(Origin) > -1){ 
         res.setHeader('Access-Control-Allow-Origin', req.headers.Origin);
         return;
    }
    // else, tough cookies. 
}

楽しい。

6
Ross The Boss

ホワイトリストから正しいCORSヘッダーを提供する簡単なミドルウェア関数を次に示します。これをエクスプレスアプリの上部近くに設定すると、すべてのルートでコンテンツを提供する前にホワイトリストから適切なヘッダーを設定できます。

app.use(function(req, res, next){
  var whitelist = ['localhost:4000', 'localhost:3000', 'anydomain.com']
  var Host = req.get('Host');

  whitelist.forEach(function(val, key){
    if (Host.indexOf(val) > -1){
      res.setHeader('Access-Control-Allow-Origin', Host);
    }
  })

  next();
});
6
Alan L.