javascript - Encabezados HTTP en la API del cliente Websockets
websocket js (7)
Parece que es fácil agregar encabezados HTTP personalizados a su cliente websocket con cualquier cliente de encabezado HTTP que lo admita, pero no puedo encontrar cómo hacerlo con la API JSON.
Sin embargo, parece que debería haber soporte para estos encabezados en la especificación .
¿Alguien tiene una pista sobre cómo lograrlo?
var ws = new WebSocket("ws://example.com/service");
Específicamente, necesito poder enviar un encabezado de Autorización HTTP.
El problema del encabezado de autorización HTTP puede abordarse con lo siguiente:
var ws = new WebSocket("ws://username:[email protected]/service");
A continuación, se configurará un encabezado HTTP de Autorización básica adecuada con el username
y la password
proporcionados. Si necesita la Autorización básica, entonces ya está todo listo.
Sin embargo, quiero usar el Bearer
, y recurrí al siguiente truco: me conecto al servidor de la siguiente manera:
var ws = new WebSocket("ws://[email protected]/service");
Y cuando mi código en el lado del servidor recibe el encabezado de Autorización básica con el nombre de usuario no vacío y la contraseña vacía, entonces interpreta el nombre de usuario como un token.
Lo pirateé totalmente así, gracias a la respuesta de kanaka.
Cliente:
var ws = new WebSocket(
''ws://localhost:8080/connect/'' + this.state.room.id,
store(''token'') || cookie(''token'')
);
Servidor (usando Koa2 en este ejemplo, pero debe ser similar donde sea):
var url = ctx.websocket.upgradeReq.url; // can use to get url/query params
var authToken = ctx.websocket.upgradeReq.headers[''sec-websocket-protocol''];
// Can then decode the auth token and do any session/user stuff...
Más de una solución alternativa, pero todos los navegadores modernos envían las cookies de dominio junto con la conexión, por lo que usan:
var authToken = ''R3YKZFKBVi'';
document.cookie = ''X-Authorization='' + authToken + ''; path=/'';
var ws = new WebSocket(
''wss://localhost:9000/wss/''
);
Termine con los encabezados de conexión de solicitud:
Cookie: X-Authorization=R3YKZFKBVi
No puede agregar encabezados pero, si solo necesita pasar valores al servidor en el momento de la conexión, puede especificar una parte de cadena de consulta en la url:
var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");
Esa URL es válida pero, por supuesto, deberá modificar su código de servidor para analizarla.
No puede enviar un encabezado personalizado cuando desea establecer una conexión WebSockets mediante JavaScript WebSockets API. Puede usar los encabezados de Subprotocols
utilizando el segundo constructor de clase WebSocket:
var ws = new WebSocket("ws://example.com/service", "soap");
y luego puede obtener los encabezados de Subprotocols usando la clave Sec-WebSocket-Protocol
en el servidor.
También hay una limitación, los valores de los encabezados de Subprotocols no pueden contener una coma ( ,
).
Técnicamente, enviará estos encabezados a través de la función de conexión antes de la fase de actualización del protocolo.
var WebSocketClient = require(''websocket'').client;
var ws = new WebSocketClient();
ws.connect(url, '''', headers);
Actualizado
Respuesta corta: No, pero la autenticación básica funciona
Respuesta más larga:
No hay ningún método en la API JavaScript WebSockets para especificar encabezados adicionales para el cliente / navegador para enviar. Sin embargo, la ruta HTTP ("GET / xyz"), el encabezado básico de autenticación ("Autorización") y el encabezado del protocolo ("Sec-WebSocket-Protocol") se pueden especificar en el constructor WebSocket.
El encabezado de Autorización se genera a partir del nombre de usuario y la contraseña (o solo nombre de usuario) campo del URI WebSocket:
var ws = new WebSocket("ws://username:[email protected]")
Lo anterior da como resultado el siguiente encabezado con la cadena "nombre de usuario: contraseña" codificada en base64:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Probé la autenticación básica en Chrome 55 y Firefox 50 y verifiqué que la información de autenticación básica se negoció con el servidor (esto puede no funcionar en Safari).
El encabezado Sec-WebSocket-Protocol (que a veces se extiende para ser utilizado en la autenticación específica de websocket) se genera a partir del segundo argumento opcional para el constructor WebSocket:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
Los resultados anteriores en los siguientes encabezados:
Sec-WebSocket-Protocol: protocol
y
Sec-WebSocket-Protocol: protocol1, protocol2
Gracias a Dmitry Frank''s por la answer autenticación básica