Socket.io-client: Неверный метод рукопожатия (только при использовании дополнительных заголовков!)

Созданный на 23 июн. 2017  ·  13Комментарии  ·  Источник: socketio/socket.io-client

Вы хотите:

  • [x] сообщить об ошибке
  • [] запросить функцию

Текущее поведение

Я получаю 400 с сообщением {"code":2,"message":"Bad handshake method"} при попытке подключить мой сервер с дополнительным заголовком (работает нормально, если я не пытаюсь его добавить).

Действия по воспроизведению (если текущее поведение является ошибкой)

Я пытаюсь подключить свой сервер со следующей конфигурацией:

  const options = {
    transportOptions: {
      polling: {
        extraHeaders: {
          Authorization: "Bearer test"
        }
      }
    }
  };

Я также заметил, что запрос OPTIONS создается, когда я добавляю этот дополнительный заголовок (вместо GET, когда я его не добавляю)

Ожидаемое поведение

Запрос на получение GET (для сохранения файлов cookie) с дополнительными заголовками, которые не нарушают рукопожатие.

Настраивать

  • ОС: Mac
  • браузер: Chrome 58
  • версия socket.io: 2.0.3

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

Привет! Я думаю, вам нужно добавить правильные заголовки на стороне сервера (похоже, вы находитесь в ситуации CORS):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

Я добавил туда пример: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

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

Та же проблема, здесь ... полностью работает с версией socket.io-client для nodejs, но не с браузером

  • ОС: Win
  • браузер: Chrome 59
  • версия socket.io: 2.0.3

Привет! Я думаю, вам нужно добавить правильные заголовки на стороне сервера (похоже, вы находитесь в ситуации CORS):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

Я добавил туда пример: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

@darrachequesne, как указать несколько доменов для происхождения, следующие способы не работают:

  1. 'Access-Control-Allow-Origin': ' http: // localhost : 3001, http: // localhost : 3002'
  2. 'Access-Control-Allow-Origin': [' http: // localhost : 3001, http: // localhost : 3002']
  3. 'Access-Control-Allow-Origin': ' http: // localhost : 3001 http: // localhost : 3002'

@DaVincii, вы не можете использовать несколько доменов, вам нужно прочитать источник заголовка клиента и снова проверить свой белый список.

увидеть это и это в stackoveflow

@DaVincii я определен как null, но освобождается для любого домена.

const headers = {
'Access-Control-Allow-Headers': 'Тип содержимого, авторизация',
'Access-Control-Allow-Origin': ноль,
'Access-Control-Allow-Credentials': истина
};

Для использования CORS
{
handlePreflightRequest: function (req, res) {
var headers = {
'Access-Control-Allow-Headers': 'Тип содержимого, авторизация',
'Access-Control-Allow-Origin': req.headers.origin,
'Access-Control-Allow-Credentials': истина
};
res.writeHead (200, заголовки);
Отправить();
}
}

Для использования CORS
{
handlePreflightRequest: function (req, res) {
var headers = {
'Access-Control-Allow-Headers': 'Тип содержимого, авторизация',
'Access-Control-Allow-Origin': req.headers.origin,
'Access-Control-Allow-Credentials': истина
};
res.writeHead (200, заголовки);
Отправить();
}
}

'Access-Control-Allow-Origin': req.headers.origin
Это просто спасло мне день! Когда я использовал:
'Access-Control-Allow-Origin': ' ',Это дало бы мне следующую ошибку:«Значение заголовка« Access-Control-Allow-Origin »в ответе не должно быть подстановочным знаком» , когда режим учетных данных запроса - «включить». Режим учетных данных запросов, инициированных XMLHttpRequest, контролируется атрибутом withCredentials . "

Похоже, это больше не работает с последней версией socket.io. Машинописцу это не нравится. Все равно исправить?
image

Похоже, это больше не работает с последней версией socket.io. Машинописцу это не нравится. Все равно исправить?

@ supertiger1234 handlePreflightRequest в последней версии имеет другой интерфейс

Screenshot 2020-07-20 at 20 16 00

Так что в вашем случае это должно быть:

...
handlePreflightRequest: function(server, req, res) {
  var headers = {
    "Access-Control-Allow-Headers": "Content-Type, Authorization",
    "Access-Control-Allow-Origin": config.allowedOrigins,
    "Access-Control-Allow-Credentials": true,
  };

  res.writeHead(200, headers);
  res.end();
...

@ supertiger1234 handlePreflightRequest в последней версии имеет другой интерфейс

⚠️ Если вы установите socket.io прямо сейчас из npm, у вас будет старая версия, но если вы установите типизацию (через @types), она будет иметь новую типизацию! Что может вводить в заблуждение.

Как установить последнюю версию socket io?

Для справки в будущем: эта проблема также возникает при использовании сервера post-3.0 с клиентом pre-3.0. Это может быть вызвано неверно настроенным кешем, из-за которого клиенты используют старую версию socket.io.js .

Для будущих читателей см .:

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