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).
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)
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.
Même problème, ici .. fonctionne totalement avec la version nodejs de socket.io-client mais pas avec le navigateur
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 :
@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?
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
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 :
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):
J'y ai ajouté un exemple : https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers