Socket.io-client: Schlechte Handshake-Methode (nur bei Verwendung zusÀtzlicher Header!)

Erstellt am 23. Juni 2017  Â·  13Kommentare  Â·  Quelle: socketio/socket.io-client

Sie wollen:

  • [x] einen Fehler melden
  • [ ] Feature anfordern

Aktuelles Verhalten

Ich erhalte eine 400 mit der Meldung {"code":2,"message":"Bad handshake method"} wenn ich versuche, meinen Server mit einem zusĂ€tzlichen Header zu verbinden (funktioniert gut, wenn ich nicht versuche, ihn hinzuzufĂŒgen).

Schritte zum Reproduzieren (wenn das aktuelle Verhalten ein Fehler ist)

Ich versuche, meinen Server mit der folgenden Konfiguration zu verbinden:

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

Mir ist auch aufgefallen, dass eine OPTIONS-Anfrage gestellt wird, wenn ich diesen zusĂ€tzlichen Header hinzufĂŒge (anstelle eines GET, wenn ich ihn nicht hinzufĂŒge).

Erwartetes Verhalten

Eine Get GET-Anfrage (zum Beibehalten von Cookies) mit den zusÀtzlichen Headern, die den Handshake nicht unterbrechen.

Konfiguration

  • Betriebssystem: Mac
  • Browser: Chrome 58
  • socket.io-Version: 2.0.3

Hilfreichster Kommentar

Hallo! Ich denke, Sie mĂŒssen serverseitig die richtigen Header hinzufĂŒgen (anscheinend befinden Sie sich in einer CORS-Situation):

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();
  }
});

Ich habe dort ein Beispiel hinzugefĂŒgt: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

Alle 13 Kommentare

Gleiches Problem, hier.. funktioniert vollstÀndig mit der nodejs-Version von socket.io-client, jedoch nicht mit dem Browser

  • Betriebssystem: Win
  • Browser: Chrome 59
  • socket.io-Version: 2.0.3

Hallo! Ich denke, Sie mĂŒssen serverseitig die richtigen Header hinzufĂŒgen (anscheinend befinden Sie sich in einer CORS-Situation):

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();
  }
});

Ich habe dort ein Beispiel hinzugefĂŒgt: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

@darrachequesne wie man mehrere DomĂ€nen fĂŒr den Ursprung angibt, die folgenden Methoden funktionieren nicht:

  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 Sie können nicht mehrere Domains verwenden, Sie mĂŒssen den Ursprung des Client-Headers lesen und Ihre Whitelist ĂŒberprĂŒfen.

Sehen Sie dies und dies auf stackoveflow

@DaVincii habe ich als null definiert, wird aber fĂŒr jede Domain freigegeben.

const-Header = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Zugriffskontrolle-Erlauben-Ursprung': null,
'Zugriffskontrolle-Zulassen-Anmeldeinformationen': true
};

FĂŒr CORS-Nutzung
{
handlePreflightRequest: Funktion (req, res) {
var-Header = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': req.headers.origin ,
'Zugriffskontrolle-Zulassen-Anmeldeinformationen': true
};
res.writeHead(200, Header);
erneut senden();
}
}

FĂŒr CORS-Nutzung
{
handlePreflightRequest: Funktion (req, res) {
var-Header = {
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Allow-Origin': req.headers.origin ,
'Zugriffskontrolle-Zulassen-Anmeldeinformationen': true
};
res.writeHead(200, Header);
erneut senden();
}
}

'Access-Control-Allow-Origin': req.headers.origin
Das hat mir gerade den Tag gerettet! Als ich verwendet habe:
'Zugriffskontrolle-Erlauben-Ursprung': ' ',Es wĂŒrde mir folgenden Fehler geben:"Der Wert des 'Access-Control-Allow-Origin'-Headers in der Antwort darf nicht der Platzhalter ' ' sein, wenn der Credentials-Modus der Anfrage 'include' ist. Der Credentials-Modus von Anfragen, die von XMLHttpRequest initiiert werden, wird durch das withCredentials-Attribut gesteuert ."

Dies scheint mit dem neuesten socket.io nicht mehr zu funktionieren. Typoskript mag es nicht. Trotzdem reparieren?
image

Dies scheint mit dem neuesten socket.io nicht mehr zu funktionieren. Typoskript mag es nicht. Trotzdem reparieren?

@supertiger1234 handlePreflightRequest hat eine andere OberflÀche in der neuesten Version

Screenshot 2020-07-20 at 20 16 00

In deinem Fall sollte es also sein:

...
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 hat in der neuesten Version eine andere Schnittstelle

⚠ Wenn Sie socket.io jetzt von npm installieren, haben Sie eine alte Version, aber wenn Sie Typisierungen installieren (ĂŒber @types), hat es neue Typisierungen! Was super irrefĂŒhrend sein kann.

Wie installiere ich das neueste Socket io?

Zur spĂ€teren Bezugnahme: Dieses Problem tritt auch auf, wenn ein Server nach 3.0 mit einem Client vor 3.0 verwendet wird. Dies kann durch einen falsch konfigurierten Cache verursacht werden, der dazu fĂŒhrt, dass die Clients eine Ă€ltere Version von socket.io.js .

FĂŒr zukĂŒnftige Leser siehe:

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen