Ecco il mio setup: Sto creando un servizio (utilizzando Negroni e Gorilla) con login utente, dove all'accesso, l'utente ottiene un cookie di sessione che il server utilizza per autorizzare endpoint protetti. Uno degli endpoint protetti consente all'utente/cliente per aprire un websocket con il server, in questo modo:Gorilla websocket con autenticazione dei cookie
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")
Tuttavia, req.Cookies()
è sempre vuoto, nel senso che non può autorizzare eventuali richieste di "/auth/connection"
- mi e' quasi positivo non è un problema con il client websocket (se sei curioso, lo sto testando usando questo pacchetto Python: https://github.com/liris/websocket-client). Mi sto avvicinando all'autenticazione di una websocket correttamente?
Qualsiasi aiuto/consiglio sarebbe molto apprezzato!
Stampa req.Header per visualizzare le intestazioni inviate dal client. Se non vedi l'intestazione del cookie o se è malformata in qualche modo, il problema è con la libreria o l'applicazione client. –
Il server gestisce l'handshake WebSocket come una normale richiesta HTTP fino al punto in cui viene chiamato l'aggiornamento. Il pacchetto Gorilla non è in gioco sulla riga di codice con il commento auth. –
Sì, avevi ragione: il cookie era malformato e non veniva analizzato correttamente in req.Cookies. Grazie per l'aiuto! – Cody