Socket.io-client: Mal método de apretón de manos (¡solo cuando se usan encabezados adicionales!)

Creado en 23 jun. 2017  ·  13Comentarios  ·  Fuente: socketio/socket.io-client

Tú quieres:

  • [x] informar un error
  • [] solicitar una función

Comportamiento actual

Recibo un 400 con el mensaje {"code":2,"message":"Bad handshake method"} cuando intento conectar mi servidor con un encabezado adicional (funciona bien si no intento agregarlo).

Pasos para reproducir (si el comportamiento actual es un error)

Intento conectar mi servidor con la siguiente configuración:

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

También noté que se realiza una solicitud de OPCIONES cuando agrego este encabezado adicional (en lugar de un GET cuando no lo agrego)

Comportamiento esperado

Una solicitud get GET (para conservar las cookies) con los encabezados adicionales que no rompen el apretón de manos.

Configuración

  • SO: Mac
  • navegador: Chrome 58
  • versión de socket.io: 2.0.3

Comentario más útil

¡Hola! Creo que debes agregar los encabezados adecuados en el lado del servidor (parece que estás en una situación 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();
  }
});

Agregué un ejemplo allí: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

Todos 13 comentarios

El mismo problema, aquí ... funciona totalmente con la versión nodejs de socket.io-client, aunque no con el navegador

  • SO: Win
  • navegador: Chrome 59
  • versión de socket.io: 2.0.3

¡Hola! Creo que debes agregar los encabezados adecuados en el lado del servidor (parece que estás en una situación 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();
  }
});

Agregué un ejemplo allí: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

@darrachequesne cómo especificar varios dominios para el origen, las siguientes formas no funcionan:

  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 no puede usar varios dominios, debe leer el origen del encabezado del cliente y verificar su lista blanca.

ver esto y esto en stackoveflow

@DaVincii lo definí como nulo, pero se libera a cualquier dominio.

encabezados const = {
'Access-Control-Allow-Headers': 'Tipo de contenido, Autorización',
'Access-Control-Allow-Origin': nulo,
'Access-Control-Allow-Credentials': verdadero
};

Para uso CORS
{
handlePreflightRequest: function (req, res) {
var encabezados = {
'Access-Control-Allow-Headers': 'Tipo de contenido, Autorización',
'Access-Control-Allow-Origin': req.headers.origin,
'Access-Control-Allow-Credentials': verdadero
};
res.writeHead (200, encabezados);
res.end ();
}
}

Para uso CORS
{
handlePreflightRequest: function (req, res) {
var encabezados = {
'Access-Control-Allow-Headers': 'Tipo de contenido, Autorización',
'Access-Control-Allow-Origin': req.headers.origin,
'Access-Control-Allow-Credentials': verdadero
};
res.writeHead (200, encabezados);
res.end ();
}
}

'Access-Control-Allow-Origin': req.headers.origin
¡Esto acaba de salvarme el día! Cuando usé:
'Access-Control-Allow-Origin': ' ',Me daría el siguiente error:"El valor del encabezado 'Access-Control-Allow-Origin' en la respuesta no debe ser el comodín ' ' cuando el modo de credenciales de la solicitud es 'incluir'. El modo de credenciales de las solicitudes iniciadas por XMLHttpRequest está controlado por el atributo withCredentials . "

Esto parece no funcionar más con el último socket.io. Mecanografiado no le gusta. De todos modos para arreglar?
image

Esto parece no funcionar más con el último socket.io. Mecanografiado no le gusta. De todos modos para arreglar?

@ supertiger1234 handlePreflightRequest tiene una interfaz diferente en la última versión

Screenshot 2020-07-20 at 20 16 00

Entonces en tu caso debería ser:

...
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 tiene una interfaz diferente en la última versión

⚠️ Si instala socket.io ahora mismo desde npm, tendrá una versión anterior, pero si instala tipificaciones (a través de @types), ¡tendrá nuevas tipificaciones! Lo que puede ser muy engañoso.

¿Cómo instalo el último socket io?

Para referencia futura: este problema también ocurre cuando se usa un servidor posterior a 3.0 con un cliente anterior a 3.0. Esto puede deberse a una caché mal configurada que hace que los clientes usen una versión anterior de socket.io.js .

Para futuros lectores, consulte:

¿Fue útil esta página
0 / 5 - 0 calificaciones