Socket.io-client: разрешить доступ к заголовкам рукопожатия

Созданный на 14 мар. 2014  ·  19Комментарии  ·  Источник: socketio/socket.io-client

При установлении соединения я могу получить доступ к строке запроса через io.connect(url, {query:'key=value'})

Я ожидал, что смогу сделать что-то подобное с заголовками.

Я хотел бы использовать это для создания webapi с аутентификацией токена.

Самый полезный комментарий

+1 есть новости по этому поводу?

Все 19 Комментарий

Хотелось бы и такой.

Я думаю, что было бы лучше сказать «установить» заголовки при выполнении запроса.

Проблема с ожиданием изменений заголовка заключается в том, что некоторые транспорты их не допускают:

  • WebSocket не разрешает пользовательские заголовки
  • Опрос JSONP (также известный как <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:

Была ли эта страница полезной?
0 / 5 - 0 рейтинги