Обновлено 2x
Краткий ответ: Нет, можно указать только путь и поле протокола.
Более длинный ответ:
В API WebSockets JavaScript нет метода для указания дополнительных заголовков для клиента / браузера для отправки. Путь HTTP («GET / xyz») и заголовок протокола («Sec-WebSocket-Protocol») можно указать в конструкторе WebSocket.
Заголовок Sec-WebSocket-Protocol (который иногда расширяется для использования в специфичной для websocket аутентификации) генерируется из необязательного второго аргумента в конструкторе WebSocket:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
Выше приведены результаты в следующих заголовках:
Sec-WebSocket-Protocol: protocol
и
Sec-WebSocket-Protocol: protocol1, protocol2
Обычным способом достижения аутентификации / авторизации WebSocket является внедрение системы создания билетов, в которой страница, на которой размещается клиент WebSocket, запрашивает билет с сервера, а затем передает этот билет во время установки соединения WebSocket либо в строке URL / запроса, либо в поле протокола, или требуется в качестве первого сообщения после установления соединения. Затем сервер разрешает продолжение соединения только в том случае, если заявка действительна (существует, еще не использовалась, IP-адрес клиента закодирован в совпадениях с заявкой, отметка времени в заявке недавно и т. Д.). Вот краткая информация о безопасности WebSocket: https://devcenter.heroku.com/articles/websocket-security
Раньше базовая аутентификация была опцией, но она устарела, и современные браузеры не отправляют заголовок, даже если он указан.
Основная информация об аутентификации (устарела) :
Заголовок авторизации создается из поля имени пользователя и пароля (или просто имени пользователя) URI WebSocket:
var ws = new WebSocket("ws://username:password@example.com")
Вышеприведенный результат приводит к следующему заголовку со строкой «username: password» в кодировке base64:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Я протестировал базовую аутентификацию в Chrome 55 и Firefox 50 и убедился, что базовая аутентификационная информация действительно согласовывается с сервером (это может не работать в Safari).
Спасибо Дмитрию Фрэнку за базовый ответ