2017-11-21 22 views
0

に設定されています。私が働く会社のセキュリティ部門はsocket.ioリクエストに(正しく)so Access-Control-Allow-Origin: *です。socket.io CORSアクセス制御許可元が*

このアプリはCORSをまったく使用していませんが、これはsocket.ioリクエストでのみ問題になります。

これは私がサーバーの準備ができた後socket.io開始するために使用しています関数です。

exports.start = (server) => { 
    io = exports.socketio.socket.listen(server, { 
     origins: `https://${server.address().address}:*`, 
     rejectUnauthorized: false, 
     wsEngine: 'ws', 
     transports: ['websocket', 'polling'] 
    }); 

    exports.connect(); 
}; 

ことで問題が最初ということである: - server.address().address戻り、この:: ような何か - 私がする必要があります異なるアドレス で複数のサーバ上のアプリケーションを配備する - 以前にそこにはoriginsプロパティはなかったとsocket.ioは*

にorigingを設定しました。私のローカルマシンで解決策をテストするとき、origins to: 'https://localhost:3000'私はまだいくつかのsocket.io要求のためにAccess-Controll-Allow-Origin: *を得ています。

enter image description here

誰かがすでにこの問題が発生していますか?

かなり自動化されたserver.address().address

答えて

0

問題を感謝すべてのヘルプは、そのパブリックIPアドレスは、そのようなロードバランサまたはプロキシか何かかもしれないので生産に、サーバーは、実際の公開さサーバーのアドレスを報告しないかもしれないということですこれは発信元フィールドにある必要があるパブリックIPアドレス(ブラウザが接続するIPアドレス)です。サーバー自体は、ドメインに公開されているものとは異なるIPアドレスを持つことができます。

socket.ioでCORSが発生するのは、socket.ioがデフォルトでhttpポーリングを使用してから実際のwebSocketに切り替わるためです。 webSocket接続自体はCORSの制限を受けません。したがって、クライアントを実際のwebSocketにのみ接続するように設定すると、CORSの問題は一切発生しません。

あなたはここでしかWebSocketをを使用する方法を見ることができます:Socket.io 1.x: use WebSockets only?

そのために私の知っている唯一の欠点は、あなたのsocket.io接続がまだWebSocketををサポートしていない古いブラウザでは動作しませんということです。意味のある量でまだ使用されている可能性のあるブラウザの場合、実際にはIE11の前のIEのバージョンが約2.5%に見えます。 IE8をまだ使用している人は、インターネットに精通していないユーザーもいるかもしれませんし、非常に厳しく管理されている企業でもあり、新しいインターネットサービスに参加する可能性は低いので、新しいインターネットサービスとの関連性は2.5%

好奇心が強い人は、2016年1月にMicrosoftがIE11より前のバージョンのIEをサポートしなくなり、その日付がすべて経過したという日付を発表しました(古いバージョンのIEではこれ以上の定期的なバグ修正はありません) )。


代替は、あなたのサーバがCORSして使用する必要があり、パブリックIPアドレスまたはドメインを追加することができ、あなたのサーバーを展開している誰起動時に読み込む設定ファイルを作成することです。

+0

ありがとうございました。それはすべて意味があります。私が答えで述べた解決策を試しましたが、動作させることができませんでした。socket.ioバージョン2.0.4を使用しています。 'websocket'をトランスポートとして使用するように設定しても、開始時に' polling'リクエストを送信することはできませんでした。 (おそらく私はまだ行っていないいくつかの設定オプション)。 'origins'オプションのために、私はsocket.io-clientとsocket.ioサーバーの両方のテストサーバーでIPアドレスをハードコーディングしましたが、私はまだAccess-Control-Allow-Originを*に設定していますが、ロードバランサまたはプロキシのために、私はAWSでホストします – matewilk

関連する問題