Actualizado 2x
Respuesta corta: No, solo se puede especificar la ruta y el campo de protocolo.
Respuesta más larga:
No hay ningún método en la API de JavaScript WebSockets para especificar encabezados adicionales para que el cliente / navegador envíe. La ruta HTTP ("GET / xyz") y el encabezado del protocolo ("Sec-WebSocket-Protocol") se pueden especificar en el constructor WebSocket.
El encabezado Sec-WebSocket-Protocol (que a veces se extiende para usarse en la autenticación específica de websocket) se genera a partir del segundo argumento opcional para el constructor de WebSocket:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
Lo anterior da como resultado los siguientes encabezados:
Sec-WebSocket-Protocol: protocol
y
Sec-WebSocket-Protocol: protocol1, protocol2
Un patrón común para lograr la autenticación / autorización de WebSocket es implementar un sistema de tickets donde la página que aloja al cliente de WebSocket solicita un ticket del servidor y luego pasa este ticket durante la configuración de la conexión de WebSocket, ya sea en la cadena URL / consulta, en el campo de protocolo, o requerido como el primer mensaje después de establecer la conexión. El servidor solo permite que la conexión continúe si el ticket es válido (existe, no se ha utilizado ya, la IP del cliente está codificada en coincidencias de tickets, la marca de tiempo en el ticket es reciente, etc.). Aquí hay un resumen de la información de seguridad de WebSocket: https://devcenter.heroku.com/articles/websocket-security
La autenticación básica era anteriormente una opción, pero esto ha quedado en desuso y los navegadores modernos no envían el encabezado incluso si se especifica.
Información de autenticación básica (en desuso) :
El encabezado de autorización se genera a partir del campo de nombre de usuario y contraseña (o simplemente nombre de usuario) del URI de WebSocket:
var ws = new WebSocket("ws://username:password@example.com")
Lo anterior da como resultado el siguiente encabezado con la cadena "nombre de usuario: contraseña" base64 codificada:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
He probado la autenticación básica en Chrome 55 y Firefox 50 y verifiqué que la información de autenticación básica se negocia con el servidor (esto puede no funcionar en Safari).
Gracias a Dmitry Frank's por la respuesta básica de autenticación.