При установлении соединения я могу получить доступ к строке запроса через io.connect(url, {query:'key=value'})
Я ожидал, что смогу сделать что-то подобное с заголовками.
Я хотел бы использовать это для создания webapi с аутентификацией токена.
Хотелось бы и такой.
Я думаю, что было бы лучше сказать «установить» заголовки при выполнении запроса.
Проблема с ожиданием изменений заголовка заключается в том, что некоторые транспорты их не допускают:
<script>
) не разрешает ихЕдинственное условие, которое позволило бы нам установить определенные заголовки, — заставить socket.io использовать только опрос XHR.
Я ожидал чего-то подобного, чтобы иметь возможность аутентифицировать клиентов. Отправка токена авторизации (или пароля) в строке запроса не является хорошей идеей.
Вместо этого я создал модуль для отправки учетных данных в теле: https://github.com/invisiblejs/socketio-auth
@rauchg , можете ли вы объяснить это дальше, в документации по адресу https://github.com/Automattic/socket.io/wiki/authorizing#handshaking говорится:
The handshake is initiated with either an XHR request or a JSONP request
Так как:
Users might want to authorize the clients based on information from the headers or IP address
С:
Not all transports sends headers when they attempt to establish a real time connection with the server
Так не означает ли это, что он все еще может установить WS-соединение, даже если рукопожатие было в XHR, и поэтому использование заголовков запроса для авторизации нормально?
Похоже, у вас был код для этого на одном этапе https://github.com/Automattic/socket.io-client/issues/344#issuecomment -9424237
Итак, я предполагаю, что были проблемы, поэтому он так и не попал в основной репозиторий, кроме файлов cookie, которые, похоже, с тех пор были удалены. В этом случае было бы неплохо обновить документацию сервера, которая немного вводит в заблуждение http://socket.io/docs/server-api/#namespace #use%28fn:function%29:namespace
var io = require('socket.io')();
io.use(function(socket, next){
if (socket.request.headers.cookie) return next();
next(new Error('Authentication error'));
});
поскольку это указывает на то, что файлы cookie (т.е. заголовки) могут использоваться для аутентификации. И добавьте замену в устаревший вики-документ по аутентификации на основном сайте с примерами для аутентификации и упоминанием проблем с другими подходами, поскольку я уверен, что это распространенный сценарий.
+1 за какое-то разрешение этого. Документы и примеры съели мое время, так как я ожидал лучшего доступа к настройке заголовков для аутентификации токена.
+1. Предстоящая версия клиента engine.io обеспечивает доступ к заголовкам, что должно облегчить решение этой проблемы.
https://github.com/socketio/engine.io-client/pull/379
Это также доступно из клиентской библиотеки JS? Кроме того, он когда-либо действительно проник? Я вижу, что он объединен, но я не думаю, что он работает, могу ошибаться
+1. Я столкнулся с похожей ситуацией, когда мне нужно аутентифицировать клиентов браузера. socket.io-client, похоже, не позволяет этого.
+1 есть новости по этому поводу?
Есть новости по этому поводу?
Есть новости по этому поводу?
Поскольку 2.0.0
, теперь вы можете предоставить объект extraHeaders
:
const socket = io({
transportOptions: {
polling: {
extraHeaders: {
'x-clientid': 'abc'
}
}
}
});
Добавлено в документацию здесь .
Поскольку
2.0.0
, теперь вы можете предоставить объектextraHeaders
:const socket = io({ transportOptions: { polling: { extraHeaders: { 'x-clientid': 'abc' } } } });
Добавлено в документацию здесь .
Я получаю следующую ошибку CORS с этим, хотя я использую cors
с express
:
Ответ на предварительный запрос не проходит проверку управления доступом: он не имеет статуса HTTP ok.
@4nubhav вам нужно передать функцию handlePreflightRequest следующим образом:
handlePreflightRequest: (request, response) => {
const headers = { ... };
response.writeHead(200, headers);
response.end();
}
Поскольку
2.0.0
, теперь вы можете предоставить объектextraHeaders
:const socket = io({ transportOptions: { polling: { extraHeaders: { 'x-clientid': 'abc' } } } });
Добавлено в документацию здесь .
Я использую .of("/path")
на сервере Socket, а затем делаю то, что объявляю URL.
@4nubhav , вы должны разрешить этот заголовок с handlePreflightRequest
на стороне сервера.
const options = {
handlePreflightRequest: (req, res) => {
res.writeHead(200, {
'Access-Control-Allow-Headers': 'x-clientid', // <<< this
});
res.end();
},
};
const io = require('socket.io')(server, options);
Обновление: в Socket.IO v3 transportOptions
больше не нужен, вы можете просто использовать:
const socket = io({
extraHeaders: {
'x-clientid': 'abc'
}
});
Документация для CORS:
Самый полезный комментарий
+1 есть новости по этому поводу?