Atualizado 2x
Resposta curta: Não, apenas o caminho e o campo do protocolo podem ser especificados.
Resposta mais longa:
Não há método na API JavaScript WebSockets para especificar cabeçalhos adicionais para o cliente / navegador enviar. O caminho HTTP ("GET / xyz") e o cabeçalho do protocolo ("Sec-WebSocket-Protocol") podem ser especificados no construtor WebSocket.
O cabeçalho Sec-WebSocket-Protocol (que às vezes é estendido para ser usado na autenticação específica do websocket) é gerado a partir do segundo argumento opcional para o construtor WebSocket:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
O resultado acima resulta nos seguintes cabeçalhos:
Sec-WebSocket-Protocol: protocol
e
Sec-WebSocket-Protocol: protocol1, protocol2
Um padrão comum para obter autenticação / autorização do WebSocket é implementar um sistema de emissão de bilhetes, em que a página que hospeda o cliente WebSocket solicita um ticket do servidor e depois passa esse ticket durante a configuração da conexão do WebSocket na URL / string de consulta, no campo protocolo, ou necessário como a primeira mensagem após o estabelecimento da conexão. O servidor só permite que a conexão continue se o ticket for válido (existe, ainda não foi usado, o IP do cliente codificado nas correspondências do ticket, o registro de data e hora do ticket é recente, etc.). Aqui está um resumo das informações de segurança do WebSocket: https://devcenter.heroku.com/articles/websocket-security
A autenticação básica era anteriormente uma opção, mas isso foi preterido e os navegadores modernos não enviam o cabeçalho, mesmo que seja especificado.
Informações básicas de autenticação (descontinuado) :
O cabeçalho de autorização é gerado a partir do campo nome de usuário e senha (ou apenas nome de usuário) do URI do WebSocket:
var ws = new WebSocket("ws://username:password@example.com")
O resultado acima resulta no seguinte cabeçalho com a cadeia "nome de usuário: senha" codificada em base64:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Testei a autenticação básica no Chrome 55 e Firefox 50 e verifiquei que as informações básicas de autenticação são realmente negociadas com o servidor (isso pode não funcionar no Safari).
Agradecimentos a Dmitry Frank's pela resposta básica de autenticação