javascript authorization add - HTTP-Header in der WebSockets-Client-API




4 Answers

Aktualisiert

Kurze Antwort: Nein, aber grundlegende Auth funktioniert

Längere Antwort:

In der JavaScript WebSockets-API gibt es keine Methode zum Angeben zusätzlicher Header für den zu sendenden Client / Browser. Der HTTP-Pfad ("GET / xyz"), der Basis-Auth-Header ("Authorization") und der Protokoll-Header ("Sec-WebSocket-Protocol") können jedoch im WebSocket-Konstruktor angegeben werden.

Der Berechtigungsheader wird aus dem Feld Benutzername und Kennwort (oder nur Benutzername) des WebSocket-URI generiert:

var ws = new WebSocket("ws://username:[email protected]")

Das obige ergibt den folgenden Header mit der Zeichenfolge "username: password" base64 encoded:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Ich habe Basic Auth in Chrome 55 und Firefox 50 getestet und überprüft, dass die grundlegenden Auth-Informationen tatsächlich mit dem Server ausgehandelt werden (dies funktioniert möglicherweise nicht in Safari).

Der Sec-WebSocket-Protocol-Header (der manchmal erweitert wird, um in websocket-spezifischer Authentifizierung verwendet zu werden) wird aus dem optionalen zweiten Argument des WebSocket-Konstruktors generiert:

var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);

Das obige ergibt die folgenden Überschriften:

Sec-WebSocket-Protocol: protocol

und

Sec-WebSocket-Protocol: protocol1, protocol2

Danke an Dmitry Frank für die grundlegende Auth- answer

new custom

Sieht so aus, als ob es einfach ist, benutzerdefinierte HTTP-Header zu Ihrem Websocket-Client mit jedem HTTP-Header-Client hinzuzufügen, der dies unterstützt, aber ich kann nicht herausfinden, wie man das mit der JSON-API macht.

Es scheint jedoch, dass diese Header in der Spezifikation unterstützt werden sollten .

Jeder hat eine Ahnung, wie man es erreicht?

var ws = new WebSocket("ws://example.com/service");

Insbesondere muss ich einen HTTP-Autorisierungsheader senden können.




Sie können keine Header hinzufügen, aber wenn Sie zum Zeitpunkt der Verbindung nur Werte an den Server übergeben müssen, können Sie einen Abfragezeichenfolgeteil in der URL angeben:

var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");

Diese URL ist gültig, aber natürlich müssen Sie Ihren Servercode ändern, um ihn zu parsen.




Technisch werden diese Header vor der Protokollaktualisierung über die Verbindungsfunktion gesendet.

var WebSocketClient = require('websocket').client;
var ws = new WebSocketClient();
ws.connect(url, '', headers);



Mehr von einer alternativen Lösung, aber alle modernen Browser senden die Domain-Cookies zusammen mit der Verbindung, also:

var authToken = 'R3YKZFKBVi';

document.cookie = 'X-Authorization=' + authToken + '; path=/';

var ws = new WebSocket(
    'wss://localhost:9000/wss/'
);

Beenden Sie mit den Anforderungsverbindungsheadern:

Cookie: X-Authorization=R3YKZFKBVi



Related