Socket.ioクライアントが接続要求を行うときに、httpヘッダーを設定しようとしています。これを行う方法はありますか?
ここに私がやっていることがあります:
// server side
var io = socketio(server);
io.use(function (socket, next) {
// authorize using authorization header in socket.request.headers
});
// client side
var socket = io(); // i'm trying to set an authorization header in this http reqeust
何か案は?ありがとう。
Socket.io-client> = 1.4を使用している場合は、 extraHeaders
オプションを使用できます。
例えば:
var socket = io("http://localhost", {
extraHeaders: {
Authorization: "Bearer authorization_token_here"
}
});
engine.io-client 、これはsocket.io-clientのバックエンドです 2015-11-28にextraHeaders
サポートが導入されました 。
クライアントはヘッダーの設定をサポートしていない のようです。すべてのトランスポートがヘッダーの設定を許可しているわけではありません。
この post by facundoolanoでは、クエリ文字列に認証トークンを配置する必要のない認証の回避策について詳しく説明しています。
彼の回避モジュールは https://github.com/invisiblejs/socketio-auth にあります。
サーバーサイドで、socket.ioがリクエストヘッダーへのアクセスを許可する理由を疑問に思います...
バージョン2.0.0/2017-01-22現在、engine.io-client supports
[feature] Allow extraHeaders to be set for browser clients in XHR requests (#519)
ただし、この時点ではsocket.io-clientはこの機能をサポートするように更新されていないため、数日後には次の手順を使用してこの物語を終了することがあります。 https://facundoolano.wordpress.com/2014/10/11/better-authentication-for-socket-io-no-query-strings /
この情報は、socket.io 1.0から非推奨になりました。
承認には、グローバルまたは名前空間(ルートを考える)の2つの方法があります。グローバルメソッドは、io.set('authorization', function (handshakeData, callback)
構成呼び出しでサーバーに設定されます。
HandshakeDataオブジェクトには、次の情報が含まれています。
{
headers: req.headers // <Object> the headers of the request
, time: (new Date) +'' // <String> date time of the connection
, address: socket.address() // <Object> remoteAddress and remotePort object
, xdomain: !!headers.Origin // <Boolean> was it a cross domain request?
, secure: socket.secure // <Boolean> https connection
, issued: +date // <Number> Epoch of when the handshake was created
, url: request.url // <String> the entrance path of the request
, query: data.query // <Object> the result of url.parse().query or a empty object
}
上記の情報と詳細な説明は、この ドキュメントページ で入手できます。