Socket.io-client: 不正なハンドシェイク方法(追加のヘッダーを使用する場合のみ!)

作成日 2017年06月23日  ·  13コメント  ·  ソース: socketio/socket.io-client

あなたはしたい:

  • [x]バグを報告する
  • []機能をリクエストする

現在の動作

サーバーを追加のヘッダーで接続しようとすると、 {"code":2,"message":"Bad handshake method"}というメッセージが表示された400が表示されます(追加しようとしない場合は正常に機能します)。

再現手順(現在の動作がバグの場合)

次の構成でサーバーを接続しようとしています。

  const options = {
    transportOptions: {
      polling: {
        extraHeaders: {
          Authorization: "Bearer test"
        }
      }
    }
  };

また、この追加ヘッダーを追加すると(追加しない場合はGETではなく)、OPTIONSリクエストが行われることに気付きました。

期待される動作

ハンドシェイクを中断しない追加のヘッダーを含むgetGETリクエスト(Cookieを保持するため)。

設定

  • OS:Mac
  • ブラウザ:Chrome 58
  • socket.ioバージョン:2.0.3

最も参考になるコメント

こんにちは! サーバー側に適切なヘッダーを追加する必要があると思います(CORSの状況にあるようです)。

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

そこに例を追加しました: https

全てのコメント13件

同じ問題、ここでは..ブラウザではなくnodejsバージョンのsocket.io-clientで完全に機能します

  • OS:勝つ
  • ブラウザ:Chrome 59
  • socket.ioバージョン:2.0.3

こんにちは! サーバー側に適切なヘッダーを追加する必要があると思います(CORSの状況にあるようです)。

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

そこに例を追加しました: https

@darrachequesneオリジンに複数のドメインを指定する方法。次の方法は機能しません。

  1. 'Access-Control-Allow-Origin': ' http:// localhost :3001、 http:// localhost :3002'
  2. 'Access-Control-Allow-Origin':[' http:// localhost :3001、 http:// localhost :3002']
  3. 'Access-Control-Allow-Origin': ' http:// localhost :3001 http:// localhost :3002'

@DaVincii複数のドメインを使用することはできません。クライアントヘッダーのオリジンを読み取り、ホワイトリストを再度確認する必要があります。

stackoveflowでこれこれを参照してください

@DaVincii iはnullとして定義されていますが、任意のドメインに解放されます。

constヘッダー= {
'Access-Control-Allow-Headers': 'Content-Type、Authorization'、
'Access-Control-Allow-Origin':null、
'Access-Control-Allow-Credentials':true
};

CORSで使用する場合
{{
handlePreflightRequest:function(req、res){
var headers = {
'Access-Control-Allow-Headers': 'Content-Type、Authorization'、
'Access-Control-Allow-Origin':req.headers.origin、
'Access-Control-Allow-Credentials':true
};
res.writeHead(200、ヘッダー);
res.end();
}
}

CORSで使用する場合
{{
handlePreflightRequest:function(req、res){
var headers = {
'Access-Control-Allow-Headers': 'Content-Type、Authorization'、
'Access-Control-Allow-Origin':req.headers.origin、
'Access-Control-Allow-Credentials':true
};
res.writeHead(200、ヘッダー);
res.end();
}
}

'Access-Control-Allow-Origin':req.headers.origin
これはちょうど私の日を救った! 私が使用したとき:
'Access-Control-Allow-Origin': ' '、次のエラーが発生します。"リクエストのクレデンシャルモードが 'include'の場合、であってはなりません。XMLHttpRequestによって開始されたリクエストのクレデンシャルモードは、withCredentials属性によって制御されます。 。」

これは、最新のsocket.ioでは機能しなくなったようです。 Typescriptはそれが好きではありません。 とにかく修正しますか?
image

これは、最新のsocket.ioでは機能しなくなったようです。 Typescriptはそれが好きではありません。 とにかく修正しますか?

@ supertiger1234 handlePreflightRequestの最新バージョンではインターフェースが異なります

Screenshot 2020-07-20 at 20 16 00

したがって、あなたの場合は次のようになります。

...
handlePreflightRequest: function(server, req, res) {
  var headers = {
    "Access-Control-Allow-Headers": "Content-Type, Authorization",
    "Access-Control-Allow-Origin": config.allowedOrigins,
    "Access-Control-Allow-Credentials": true,
  };

  res.writeHead(200, headers);
  res.end();
...

@ supertiger1234 handlePreflightRequestは、最新バージョンでは異なるインターフェースを持っています

⚠️npmから今すぐsocket.ioをインストールすると古いバージョンになりますが、(@ typesを介して)タイピングをインストールすると新しいタイピングになります! これは非常に誤解を招く可能性があります。

最新のソケットioをインストールするにはどうすればよいですか?

今後の参考のために:この問題は、3.0より前のクライアントで3.0より後のサーバーを使用している場合にも発生します。 これは、クライアントが古いバージョンのsocket.io.js使用するようにキャッシュが正しく構成されていないことが原因である可能性があります。

今後の読者は、以下を参照してください。

  • v2のCORSドキュメント: https
  • v3のCORSドキュメント: https
このページは役に立ちましたか?
0 / 5 - 0 評価