Heim >Web-Frontend >js-Tutorial >Wie kann ich benutzerdefinierte HTTP-Header, z. B. Autorisierung, zu einer WebSocket-Client-Verbindung in JavaScript hinzufügen?

Wie kann ich benutzerdefinierte HTTP-Header, z. B. Autorisierung, zu einer WebSocket-Client-Verbindung in JavaScript hinzufügen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-30 08:13:14648Durchsuche

How Can I Add Custom HTTP Headers, Such as Authorization, to a WebSocket Client Connection in JavaScript?

HTTP-Header in der WebSocket-Client-API

Verwenden Sie einen beliebigen HTTP-Header-Client, der diese Funktion unterstützt, um die HTTP-Header anzupassen. Es scheint einfach zu sein, einen hinzuzufügen WebSocket-Client, aber ich kann nicht finden, wie ich das mit der WebSocket-API der Netzwerkplattform machen kann.

Weiß jemand, wie man es umsetzt?

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

Insbesondere muss der HTTP-Autorisierungsheader gesendet werden können.

Aktualisiert

  • Kurze Antwort: Nein, es können nur die Pfad- und Protokollfelder angegeben werden.
  • Lange Antwort:

Es gibt keine Methode in der JavaScript-WebSockets-API, um zusätzliche Header anzugeben, die der Client/Browser sendet. Im WebSocket-Konstruktor können der HTTP-Pfad („GET /xyz“) und der Protokollheader („Sec-WebSocket-Protocol“) angegeben werden.

Der Sec-WebSocket-Protocol-Header (manchmal erweitert für die Verwendung in der WebSocket-spezifischen Authentifizierung) ist von WebSocket abgeleitet Das optionale zweite Argument für den Konstruktor generiert:

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

Der obige Code führt zu den folgenden Headern:

Sec-WebSocket-Protocol: protocol

und

Sec-WebSocket-Protocol: protocol1, protocol2

implementieren WebSocket A Common Das Muster für die Authentifizierung/Autorisierung besteht darin, ein Ticketsystem zu implementieren, bei dem die Seite, die den WebSocket-Client hostet, ein Ticket vom Server anfordert, der dann gesendet wird Dieses Ticket wird beim Verbindungsaufbau übergeben, entweder in der URL/Abfragezeichenfolge, im Protokollfeld oder durch Angabe als erste Nachricht nach dem Verbindungsaufbau. Der Server lässt die Verbindung dann nur dann weiter, wenn das Ticket gültig ist (existiert, wurde nicht verwendet, die im Ticket kodierte Client-IP stimmt überein, der Zeitstempel im Ticket ist neuer, etc.). Im Folgenden finden Sie eine Zusammenfassung der WebSocket-Sicherheitsinformationen: https://devcenter.heroku.com/articles/websocket-security.

Früher war die Basisauthentifizierung eine Option, diese ist jedoch veraltet und moderne Browser senden diesen Header nicht, selbst wenn er angegeben ist.

Grundlegende Authentifizierungsinformationen (veraltet – nicht mehr funktionsfähig):

Der Autorisierungsheader besteht aus den Feldern Benutzername und Passwort (oder nur Benutzername) aus dem WebSocket-URI. Generiert:

var ws = new WebSocket("ws://username:password@")

Der obige Code wird mit base64 generiert Codieren Sie den folgenden Header für die Zeichenfolge „Benutzername:Passwort“:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Die Basisauthentifizierung wurde in Chrome 55 und Firefox 50 getestet und bestätigt, dass die Informationen zur Basisauthentifizierung tatsächlich mit dem Server ausgehandelt werden (dies funktioniert möglicherweise nicht). auf Safari).

Vielen Dank an Dmitry Frank für die Antwort zur Basisauthentifizierung.

Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte HTTP-Header, z. B. Autorisierung, zu einer WebSocket-Client-Verbindung in JavaScript hinzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn