Socket.io-client: Mauvaise méthode de prise de contact (uniquement lors de l'utilisation d'en-têtes supplémentaires !)

Créé le 23 juin 2017  ·  13Commentaires  ·  Source: socketio/socket.io-client

Tu veux:

  • [x] signaler un bogue
  • [ ] demander une fonctionnalité

Comportement actuel

J'obtiens un 400 avec le message {"code":2,"message":"Bad handshake method"} lorsque j'essaie de connecter mon serveur avec un en-tête supplémentaire (fonctionne bien si je n'essaye pas de l'ajouter).

Étapes à reproduire (si le comportement actuel est un bug)

J'essaye de connecter mon serveur avec la configuration suivante :

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

J'ai également remarqué qu'une demande OPTIONS est faite lorsque j'ajoute cet en-tête supplémentaire (au lieu d'un GET lorsque je ne l'ajoute pas)

Comportement attendu

Une requête get GET (pour conserver les cookies) avec les en-têtes supplémentaires qui ne rompent pas la poignée de main.

Installer

  • OS : Mac
  • navigateur : Chrome 58
  • version socket.io : 2.0.3

Commentaire le plus utile

Salut! Je pense que vous devez ajouter les en-têtes appropriés côté serveur (il semble que vous soyez dans une situation 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();
  }
});

J'y ai ajouté un exemple : https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

Tous les 13 commentaires

Même problème, ici .. fonctionne totalement avec la version nodejs de socket.io-client mais pas avec le navigateur

  • OS : Gagner
  • navigateur : Chrome 59
  • version socket.io : 2.0.3

Salut! Je pense que vous devez ajouter les en-têtes appropriés côté serveur (il semble que vous soyez dans une situation 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();
  }
});

J'y ai ajouté un exemple : https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

@darrachequesne comment spécifier plusieurs domaines pour l'origine, les méthodes suivantes ne fonctionnent pas :

  1. 'Access-Control-Allow-Origin' : ' http://localhost :3001, http://localhost :3002'
  2. 'Contrôle d'accès-Autoriser-Origine' : [' http://localhost :3001, http://localhost :3002']
  3. 'Access-Control-Allow-Origin' : ' http://localhost :3001 http://localhost :3002'

@DaVincii, vous ne pouvez pas utiliser plusieurs domaines, vous devez lire l'origine de l'en-tête du client et vérifier votre liste blanche.

voir ceci et cela sur stackoveflow

@DaVincii i défini comme null, mais est libéré dans n'importe quel domaine.

en-têtes const = {
'Access-Control-Allow-Headers' : 'Content-Type, Authorization',
'Contrôle-Accès-Autoriser-Origine' : null,
'Access-Control-Allow-Credentials' : vrai
} ;

Pour l'utilisation du CORS
{
handlePreflightRequest : fonction (req, res) {
en-têtes var = {
'Access-Control-Allow-Headers' : 'Content-Type, Authorization',
'Access-Control-Allow-Origin' : req.headers.origin ,
'Access-Control-Allow-Credentials' : vrai
} ;
res.writeHead(200, en-têtes);
res.end();
}
}

Pour l'utilisation du CORS
{
handlePreflightRequest : fonction (req, res) {
en-têtes var = {
'Access-Control-Allow-Headers' : 'Content-Type, Authorization',
'Access-Control-Allow-Origin' : req.headers.origin ,
'Access-Control-Allow-Credentials' : vrai
} ;
res.writeHead(200, en-têtes);
res.end();
}
}

'Access-Control-Allow-Origin' : req.headers.origin
Cela vient de me sauver la journée ! Quand j'ai utilisé :
'Contrôle-Accès-Autoriser-Origine' : ' ',Cela me donnerait l'erreur suivante :"La valeur de l'en-tête 'Access-Control-Allow-Origin' dans la réponse ne doit pas être le caractère générique ' ' lorsque le mode d'identification de la demande est 'include'. Le mode d'identification des demandes initiées par XMLHttpRequest est contrôlé par l'attribut withCredentials ."

Cela ne semble plus fonctionner avec le dernier socket.io. Tapuscrit ne l'aime pas. De toute façon à corriger?
image

Cela ne semble plus fonctionner avec le dernier socket.io. Tapuscrit ne l'aime pas. De toute façon à corriger?

@supertiger1234 handlePreflightRequest a une interface différente dans la dernière version

Screenshot 2020-07-20 at 20 16 00

Donc dans ton cas ça devrait être :

...
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 a une interface différente dans la dernière version

⚠️ Si vous installez socket.io dès maintenant à partir de npm, vous aurez une ancienne version, mais si vous installez des typages (via @types), il y aura de nouveaux typages ! Ce qui peut être super trompeur.

Comment installer le dernier socket io ?

Pour référence future : ce problème se produit également lors de l'utilisation d'un serveur post-3.0 avec un client pré-3.0. Cela peut être dû à un cache mal configuré qui oblige les clients à utiliser une ancienne version de socket.io.js .

Pour les futurs lecteurs, veuillez consulter :

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

crazyyi picture crazyyi  ·  5Commentaires

najibghadri picture najibghadri  ·  7Commentaires

catamphetamine picture catamphetamine  ·  3Commentaires

BorntraegerMarc picture BorntraegerMarc  ·  4Commentaires

ahadcove picture ahadcove  ·  7Commentaires