Оновлено 2 рази
Коротка відповідь: Ні, можна вказати лише поле шляху та протоколу.
Більш довга відповідь:
В API WebSockets JavaScript немає методу для визначення додаткових заголовків для клієнта / браузера, що надсилається. Шлях HTTP ("GET / xyz") та заголовок протоколу ("Sec-WebSocket-протокол") можуть бути визначені в конструкторі WebSocket.
Заголовок протоколу Sec-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")
Вищезазначене призводить до наступного заголовка з кодуваним рядком "ім'я користувача: пароль" base64:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Я перевірив основні auth в Chrome 55 та Firefox 50 і переконався, що основна інформація про автентичність дійсно узгоджена з сервером (це може не працювати в Safari).
Дякую Дмитру Франку за основну авторську відповідь