Hier ist mein Setup: Ich baue einen Dienst (mit Negroni und Gorilla) mit Benutzeranmeldung, bei der Anmeldung erhält der Benutzer ein Session-Cookie, mit dem der Server geschützte Endpunkte autorisiert. Einer der geschützten Endpunkten ermöglicht es dem Benutzer/Client eine websocket mit dem Server zu öffnen, etwa so:Gorilla websocket mit Cookie-Authentifizierung
app := negroni.New()
r := mux.NewRouter()
r.HandleFunc("/auth/connection", func(rw http.ResponseWriter, req *http.Request) {
// authorize request using req.Cookie("session_id")
// create websocket
conn, err := upgrader.Upgrade(rw, req, nil)
if err != nil {
panic(err)
}
defer conn.Close()
// do stuff...
})
app.UseHandler(r)
app.Run(":3000")
jedoch req.Cookies()
ist immer leer, ich kann keine Anfragen zu "/auth/connection"
autorisieren bedeutet - und ich Ich bin fast positiv, es ist kein Problem mit dem Websocket-Client (wenn Sie neugierig sind, teste ich es mit diesem Python-Paket: https://github.com/liris/websocket-client). Komme ich der Authentifizierung eines Websockets korrekt zu?
Jede Hilfe/Beratung würde sehr geschätzt werden!
Drucken req.Header, um die vom Client gesendeten Header anzuzeigen. Wenn Sie die Cookie-Kopfzeile nicht sehen oder sie in irgendeiner Weise fehlerhaft ist, liegt das Problem bei der Client-Bibliothek oder -Anwendung. –
Der Server behandelt den WebSocket-Handshake als normale HTTP-Anforderung bis zu dem Punkt, an dem das Upgrade aufgerufen wird. Das Gorilla-Paket ist nicht in der Codezeile mit dem Auth-Kommentar enthalten. –
Yup, du hattest Recht - der Cookie war fehlerhaft und wurde nicht richtig in req.Cookies geparst. Danke für die Hilfe! – Cody