2x aktualisiert
Kurze Antwort: Nein, nur das Pfad- und Protokollfeld kann angegeben werden.
Längere Antwort:
In der JavaScript- WebSockets-API gibt es keine Methode zum Angeben zusätzlicher Header, die der Client / Browser senden soll. Der HTTP-Pfad ("GET / xyz") und der Protokollheader ("Sec-WebSocket-Protocol") können im WebSocket-Konstruktor angegeben werden.
Der Sec-WebSocket-Protocol-Header (der manchmal erweitert wird, um für die Websocket-spezifische Authentifizierung verwendet zu werden) wird aus dem optionalen zweiten Argument für den WebSocket-Konstruktor generiert:
var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);
Das Obige führt zu folgenden Überschriften:
Sec-WebSocket-Protocol: protocol
und
Sec-WebSocket-Protocol: protocol1, protocol2
Ein gängiges Muster zum Erreichen der WebSocket-Authentifizierung / -Autorisierung besteht darin, ein Ticketing-System zu implementieren, bei dem die Seite, auf der sich der WebSocket-Client befindet, ein Ticket vom Server anfordert und dieses Ticket dann während des Aufbaus der WebSocket-Verbindung entweder in der URL / Abfragezeichenfolge im Protokollfeld weiterleitet. oder als erste Nachricht nach dem Herstellen der Verbindung erforderlich. Der Server lässt dann nur dann zu, dass die Verbindung fortgesetzt wird, wenn das Ticket gültig ist (vorhanden, noch nicht verwendet, Client-IP in Ticket-Übereinstimmungen codiert, Zeitstempel im Ticket ist aktuell usw.). Hier ist eine Zusammenfassung der WebSocket-Sicherheitsinformationen: https://devcenter.heroku.com/articles/websocket-security
Früher war die Standardauthentifizierung eine Option, diese ist jedoch veraltet, und moderne Browser senden den Header nicht, selbst wenn er angegeben ist.
Grundlegende Auth-Informationen (veraltet) :
Der Autorisierungsheader wird aus dem Feld Benutzername und Kennwort (oder nur Benutzername) des WebSocket-URI generiert:
var ws = new WebSocket("ws://username:password@example.com")
Das Obige führt zu folgendem Header mit der Zeichenfolge "Benutzername: Passwort" base64-codiert:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Ich habe die Basisauthentifizierung in Chrome 55 und Firefox 50 getestet und überprüft, dass die Basisauthentifizierungsinformationen tatsächlich mit dem Server ausgehandelt werden (dies funktioniert möglicherweise nicht in Safari).
Vielen Dank an Dmitry Frank für die grundlegende Antwort