2015-03-29 6 views
6

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!

+4

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. –

+2

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. –

+0

Yup, du hattest Recht - der Cookie war fehlerhaft und wurde nicht richtig in req.Cookies geparst. Danke für die Hilfe! – Cody

Antwort

0

Der Server behandelt den WebSocket-Handshake als normale HTTP-Anforderung bis zu dem Punkt, an dem Upgrade aufgerufen wird. Verwenden Sie die Authentifizierung, die Sie für normale HTTP-Anforderungen verwenden würden.

Das Gorilla-Paket befindet sich nicht in der Codezeile mit dem Auth-Kommentar.