Похоже, что легко добавить пользовательские заголовки HTTP в ваш клиент websocket с любым клиентом заголовка HTTP, который поддерживает это, но я не могу найти, как это сделать с помощью JSON API.
Тем не менее, кажется, что эти заголовки должны быть поддержаны в спецификации .
Кто-нибудь знает, как этого добиться?
var ws = new WebSocket("ws://example.com/service");
В частности, мне нужно иметь возможность отправлять заголовок авторизации HTTP.
javascript
http
header
websocket
Жюльен Дженесту
источник
источник
connect
запрос. Я использую каналы Django на заднем конце, и я разработал его, чтобы принимать соединение поconnect
событию. затем он устанавливает флаг «is_auth» вreceive
событии (если он видит действительное сообщение аутентификации). если флаг is_auth не установлен и это не сообщение аутентификации, то соединение закрывается.Ответы:
Обновлено 2x
Краткий ответ: Нет, можно указать только путь и поле протокола.
Более длинный ответ:
В API WebSockets JavaScript нет метода для указания дополнительных заголовков для клиента / браузера для отправки. Путь HTTP («GET / xyz») и заголовок протокола («Sec-WebSocket-Protocol») можно указать в конструкторе WebSocket.
Заголовок Sec-WebSocket-Protocol (который иногда расширяется для использования в специфичной для websocket аутентификации) генерируется из необязательного второго аргумента в конструкторе WebSocket:
Выше приведены результаты в следующих заголовках:
и
Обычным способом достижения аутентификации / авторизации WebSocket является внедрение системы создания билетов, в которой страница, на которой размещается клиент WebSocket, запрашивает билет с сервера, а затем передает этот билет во время установки соединения WebSocket либо в строке URL / запроса, либо в поле протокола, или требуется в качестве первого сообщения после установления соединения. Затем сервер разрешает продолжение соединения только в том случае, если заявка действительна (существует, еще не использовалась, IP-адрес клиента закодирован в совпадениях с заявкой, отметка времени в заявке недавно и т. Д.). Вот краткая информация о безопасности WebSocket: https://devcenter.heroku.com/articles/websocket-security
Раньше базовая аутентификация была опцией, но она устарела, и современные браузеры не отправляют заголовок, даже если он указан.
Основная информация об аутентификации (устарела) :
Заголовок авторизации создается из поля имени пользователя и пароля (или просто имени пользователя) URI WebSocket:
Вышеприведенный результат приводит к следующему заголовку со строкой «username: password» в кодировке base64:
Я протестировал базовую аутентификацию в Chrome 55 и Firefox 50 и убедился, что базовая аутентификационная информация действительно согласовывается с сервером (это может не работать в Safari).
Спасибо Дмитрию Фрэнку за базовый ответ
источник
Это скорее альтернативное решение, но все современные браузеры отправляют файлы cookie домена вместе с подключением, поэтому используют:
Получите заголовки соединения запроса:
источник
Проблема с заголовком HTTP-авторизации может быть решена с помощью следующего:
Затем будет установлен правильный HTTP-заголовок Basic Authorization с указанием
username
иpassword
. Если вам нужна базовая авторизация, то все готово.Я хочу использовать,
Bearer
однако, и я прибег к следующей уловке: я подключаюсь к серверу следующим образом:И когда мой код на стороне сервера получает заголовок Basic Authorization с непустым именем пользователя и пустым паролем, он интерпретирует имя пользователя как токен.
источник
wss://user:password@myhost.com/ws
) и не получилAuthorization
заголовок на стороне сервера (используя Chrome версии 60)wss://user:pass@host
формате. Это не поддерживается браузерами или что-то не так с рукопожатием?Вы не можете добавлять заголовки, но, если вам просто нужно передать значения на сервер в момент соединения, вы можете указать часть строки запроса в URL:
Этот URL-адрес действителен, но, разумеется, вам потребуется изменить код сервера для его анализа.
источник
Вы не можете отправлять пользовательский заголовок, если хотите установить соединение WebSockets с помощью JavaScript WebSockets API. Вы можете использовать
Subprotocols
заголовки, используя второй конструктор класса WebSocket:и затем вы можете получить заголовки Subprotocols, используя
Sec-WebSocket-Protocol
ключ на сервере.Существует также ограничение: значения заголовков ваших подпротоколов не могут содержать запятую (
,
)!источник
Sec-WebSocket-Protocol
заголовок как альтернативуAuthorization
заголовку?Отправка заголовка авторизации невозможна.
Присоединение параметра запроса токена является опцией. Однако в некоторых случаях может быть нежелательно отправлять основной токен входа в виде обычного текста в качестве параметра запроса, поскольку он более непрозрачен, чем использование заголовка, и в конечном итоге будет зарегистрирован, кто знает где. Если это вызывает у вас проблемы с безопасностью, альтернативой является использование вторичного токена JWT только для веб-сокетов .
Создайте конечную точку REST для генерации этого JWT , к которому, конечно, могут получить доступ только пользователи, аутентифицированные с помощью вашего основного токена входа (переданного через заголовок). Веб-сокет JWT может быть настроен иначе, чем ваш токен входа, например, с более коротким тайм-аутом, поэтому безопаснее отправлять его в качестве параметра запроса на обновление.
Создайте отдельный JwtAuthHandler для того же маршрута, на котором вы регистрируете SockJS eventbusHandler . Сначала убедитесь, что ваш обработчик аутентификации зарегистрирован, чтобы вы могли проверить токен веб-сокета в своей базе данных (JWT должен быть каким-то образом связан с вашим пользователем в бэкэнде).
источник
Полностью взломал это, как это, благодаря ответу Канаки.
Клиент:
Сервер (использующий Koa2 в этом примере, но должен быть похожим везде):
источник
Мое дело:
www.mycompany.com/api/ws
...localhost:8000
).Настройка
document.cookie = "sessionid=foobar;path=/"
не поможет, так как домены не совпадают.Решение :
Добавить
127.0.0.1 wsdev.company.com
в/etc/hosts
.Таким образом, ваш браузер будет использовать файлы cookie
mycompany.com
при подключении к тому,www.mycompany.com/api/ws
как вы подключаетесь с действительного субдоменаwsdev.company.com
.источник
В моей ситуации (обзор временных рядов Azure wss: //)
Используя оболочку ReconnectingWebsocket и смог добиться добавления заголовков с помощью простого решения:
Где полезная нагрузка в этом случае:
источник
Технически, вы будете отправлять эти заголовки через функцию соединения до фазы обновления протокола. Это сработало для меня в
nodejs
проекте:источник
headers
msgstr " должен быть либо пустым, либо объектом, указывающим дополнительные произвольные заголовки HTTP-запроса для отправки вместе с запросом." от WebSocketClient.md ; следовательно,headers
здесь есть уровень HTTP.connect
метода, описанную какconnect(requestUrl, requestedProtocols, [[[origin], headers], requestOptions])
, то естьheaders
должна быть предоставленаrequestOptions
, например, вместе сws.connect(url, '', headers, null)
. Вorigin
этом случае можно игнорировать только строку.Вы можете передать заголовки в качестве значения ключа в третьем параметре (опциях) внутри объекта. Пример с токеном авторизации. Оставил протокол (второй параметр) как ноль
Редактировать: похоже, что этот подход работает только с библиотекой nodejs, а не со стандартной реализацией браузера. Оставляя это, потому что это может быть полезно для некоторых людей.
источник