Socket.io-client, как установить заголовок запроса при подключении
Я пытаюсь установить http-заголовок, когда клиент socket.io делает запрос на соединение. Есть ли способ сделать это?
Вот что я делаю:
// server side
var io = socketio(server);
io.use(function (socket, next) {
// authorize using authorization header in socket.request.headers
});
// client side
var socket = io(); // i'm trying to set an authorization header in this http reqeust
Любые идеи? Спасибо.
Ответы
Ответ 1
Вы можете использовать extraHeaders
, если вы используете socket.io-client >= 1.4.
Например:
var socket = io("http://localhost", {
extraHeaders: {
Authorization: "Bearer authorization_token_here"
}
});
engine.io-client, который является базой для socket.io-client, представил extraHeaders
поддержку в 2015 году, 11-28.
Ответ 2
Кажется, что клиент не поддерживает настройки заголовков, так как не все транспорты допускают настройку заголовков.
Этот пост от facundoolano описывает обходное решение для аутентификации, которое не требует размещения маркера auth в строке запроса.
Его обходной модуль можно найти в https://github.com/invisiblejs/socketio-auth.
Заставляет меня задаться вопросом, почему на серверной стороне socket.io разрешает доступ к заголовкам запроса...
Ответ 3
Начиная с версии 2.0.0/2017-01-22 engine.io-client поддерживает
[feature] Allow extraHeaders to be set for browser clients in XHR requests (#519)
Однако в этот момент сокет .io-клиент не обновляется для поддержки этой функции, поэтому пару дней может завершить эту сагу до тех пор, пока не будут использованы следующие инструкции: https://facundoolano.wordpress.com/2014/10/11/better-authentication-for-socket-io-no-query-strings/
Ответ 4
Эта информация устарела, поскольку socket.io 1.0
Существует два метода авторизации: global или namespace (think route). Глобальный метод устанавливается на сервере с помощью io.set('authorization', function (handshakeData, callback)
вызова конфигурации.
Объект handshakeData содержит следующую информацию:
{
headers: req.headers // <Object> the headers of the request
, time: (new Date) +'' // <String> date time of the connection
, address: socket.address() // <Object> remoteAddress and remotePort object
, xdomain: !!headers.origin // <Boolean> was it a cross domain request?
, secure: socket.secure // <Boolean> https connection
, issued: +date // <Number> EPOCH of when the handshake was created
, url: request.url // <String> the entrance path of the request
, query: data.query // <Object> the result of url.parse().query or a empty object
}
Вышеуказанная информация и более глубокое объяснение доступны на этой странице .