Authentifizierung von WebSocket-Verbindungen über HTTP-Middleware
WebSocket-Verbindungen bieten eine Möglichkeit zur Echtzeitkommunikation zwischen Clients und Servern. Im Gegensatz zu HTTP-Anfragen unterstützen WebSockets jedoch nicht grundsätzlich die Autorisierung oder Authentifizierung. Um dieses Problem zu lösen, kann HTTP-Middleware zum Sichern von WebSocket-Verbindungen verwendet werden.
Problemstellung
Ein gängiger Ansatz besteht darin, den Upgrade-Handshake mithilfe des Codes der Anwendung zur Authentifizierung von HTTP zu authentifizieren Anfragen. Die Implementierung dieses Ansatzes in Golang mithilfe des WebSocket-Upgrades von Gorilla hat sich jedoch als Herausforderung erwiesen.
Community-Vorschläge
Einige Community-Vorschläge umfassen:
Fehlgeschlagene Strategie
Die fehlgeschlagene Strategie beinhaltete das Hinzufügen eines benutzerdefinierten Headers („X-Api -Key") zur anfänglichen HTTP-GET-Anfrage hinzufügen und nur Clients mit einem passenden Schlüssel aktualisieren. Dies führte jedoch dazu, dass der Client das WebSocket-Protokoll nicht nutzen konnte und auf dem Server die Fehlermeldung „Upgrade-Token nicht gefunden“ angezeigt wurde.
Verbesserte Lösung für Strategie 1
Zu Verbesserungsstrategie 1: Die Authentifizierung sollte beim WebSocket-Handshake selbst durchgeführt werden. Dies kann erreicht werden, indem die Authentifizierungsheader als letztes Argument an Dial im Clientcode übergeben werden.
<br>func main() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"} headers := http.Header{"X-Api-Key": []string{"test_api_key"}} conn, _, err := websocket.DefaultDialer.Dial(u.String(), headers) if err != nil { log.Fatalf("dial err: %v", err) }
}
Auf der Serverseite sollte die Authentifizierung mithilfe des vorhandenen Codes der Anwendung zur Authentifizierung von HTTP-Anfragen während des Handshake-Prozesses durchgeführt werden. Dadurch wird sichergestellt, dass die WebSocket-Verbindung nur dann hergestellt wird, wenn der Client autorisiert ist.
Das obige ist der detaillierte Inhalt vonWie kann HTTP-Middleware WebSocket-Verbindungen in Golang sichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!