HTTP-заголовки в API-интерфейсах Websockets

Похоже, что добавить пользовательские HTTP-заголовки к клиенту websocket с любым HTTP-заголовком, который поддерживает этот var ws = new WebSocket ( «ws: //example.com/service» ) , легко. но я не могу найти, как это сделать с помощью JSON API.

Тем не менее, похоже, что поддержка этих заголовков должна быть в спецификации .

Кто-нибудь знает, как его достичь?

var ws = new WebSocket("ws://username:password@example.com")

В частности, мне нужно иметь возможность отправлять заголовок HTTP-авторизации.

javascript,http,header,websocket,

125

Ответов: 8


140 ов принято

обновленный

Короткий ответ: Нет, но основные работы

Более длинный ответ:

В API JavaScript WebSockets нет метода для указания дополнительных заголовков для отправки клиентом / браузером. Однако в конструкторе WebSocket может быть указан HTTP-путь («GET / xyz»), базовый заголовок auth («Авторизация») и заголовок протокола (« Авторизация : базовый dXNlcm5hbWU6cGFzc3dvcmQ = »).

Заголовок авторизации генерируется из var ws = new WebSocket ( «ws: //example.com/path» , «protocol» ); var ws = new WebSocket ( "ws: //example.com/path" , [ "protocol1" , "protocol2" ]); и Sec - WebSocket - протокол : протокол (или просто имя пользователя) поля URI WebSocket:

Sec-WebSocket-Protocol: protocol1, protocol2

Вышеприведенные результаты приводятся в следующем заголовке со строкой «username: password» base64 encoded:

var ws = new WebSocket("ws://username:password@example.com/service");

Я протестировал базовый auth в Chrome 55 и Firefox 50 и подтвердил, что основная информация об аутентификации действительно согласована с сервером (это может не работать в Safari).

Заголовка Sec-WebSocket-Protocol (который иногда расширяется для использования в аутентификации с использованием websocket) генерируется из необязательного второго аргумента в конструктор WebSocket:

username

Вышеуказанные результаты заключаются в следующих заголовках:

password

а также

Bearer

Спасибо Дмитрию Фрэнку за базовый автоответчик


19 ов

Проблема заголовка HTTP-авторизации может быть решена следующим образом:

var ws = new WebSocket("ws://my_token@example.com/service");

Затем соответствующий HTTP-заголовок Basic Authorization будет установлен с предоставленным usernameи password. Если вам нужна базовая авторизация, тогда вы все настроены.


Однако я хочу использовать , и я прибег к следующему трюку: я подключаюсь к серверу следующим образом:var authToken = 'R3YKZFKBVi'; document.cookie = 'X-Authorization=' + authToken + '; path=/'; var ws = new WebSocket( 'wss://localhost:9000/wss/' );

Cookie: X-Authorization=R3YKZFKBVi

И когда мой код на стороне сервера получает заголовок Basic Authorization с непустым именем пользователя и пустым паролем, он интерпретирует имя пользователя как токен.


9

Больше альтернативного решения, но все современные браузеры отправляют куки домена вместе с соединением, поэтому используя:

var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");

Завершите работу с заголовками соединений запроса:

Subprotocols

Вы не можете добавлять заголовки, но если вам просто нужно передать значения на сервер в момент соединения, вы можете указать часть строки запроса на URL:

var ws = new WebSocket("ws://example.com/service", "soap");

Этот URL-адрес действителен, но, конечно же, вам потребуется изменить код сервера для его анализа.


Вы не можете отправлять настраиваемый заголовок, если хотите установить соединение с WebSockets, используя API JavaScript WebSockets. Вы можете использовать Sec-WebSocket-Protocolзаголовки, используя второй конструктор класса WebSocket:

,

а затем вы можете получить заголовки подпрограмм, используя Sec-WebSocket-Protocolключ на сервере.

Существует также ограничение, ваши значения заголовков подпрограмм не могут содержать запятую ( ,)!

JavaScript, HTTP, заголовок, WebSocket,
Похожие вопросы