Le sessioni sono un'opzione popolare per l'autenticazione degli utenti sul Web. Una sessione è un periodo durante il quale un utente interagisce attivamente con un'applicazione. La durata di una sessione inizia quando un utente effettua l'accesso e termina quando si disconnette.

HTTP è un protocollo stateless, quindi spesso dovrai monitorare manualmente l'attività dell'utente.

Sul lato server della tua applicazione, puoi generare un valore univoco, preferibilmente crittograficamente sicuro. Puoi quindi memorizzarlo in un cookie che il client invierà alla tua app su richieste future, creando una forma di stato.

Sessioni in Go

Puoi usare il pacchetto net/http per implementare le sessioni e ci sono molti pacchetti disponibili che già lo fanno. Il più popolare è il pacchetto di sessioni Gorilla. Questo pacchetto fornisce funzionalità di archiviazione di file e cookie insieme a un'infrastruttura di back-end di sessione personalizzata.

Esegui questo comando sul tuo spazio di lavoro Go per installare il pacchetto sessioni Gorilla.

instagram viewer
andare ottenere github.com/gorilla/sessions

In questo tutorial utilizzerai un cookie store per le sessioni. Utilizzerai il pacchetto net/http per avviare un server Web che verificherà il problema dell'utente e revocherà le sessioni.

Ecco l'elenco delle importazioni di cui avrai bisogno per seguire questo tutorial.

importare (
"github.com/gorilla/sessions"
"tronco d'albero"
"rete/http"
)

Il tronco d'albero il pacchetto serve per le operazioni relative alla registrazione in base allo stato dell'autenticazione dell'utente.

Una semplice implementazione di Cookie Store

Avrai bisogno di un cookie store per le tue funzioni di login e logout handler. Per il tuo negozio di cookie, avrai bisogno di una chiave segreta per l'autenticazione.

Ecco una funzione per l'implementazione del cookie store.

// La funzione cookieStore crea un cookie store con la chiave segreta dell'utente
funzcookieStore() *sessioni.CookieStore {
Chiave segreta := []byte("chiave segreta super segreta")
cookieStore := sessioni. NuovoCookieStore (SecretKey)

// La funzione restituisce il cookie store in modo che altre funzioni possano accedervi
Restituzione cookieStore
}

Nel cookieStore funzione, la variabile della chiave segreta dichiarata Chiave segreta è un esempio di chiave segreta. In produzione, la tua chiave segreta dovrebbe essere crittograficamente protetta, ad esempio utilizzando il pacchetto crittografico. Dovresti anche caricare il segreto da un file di variabili d'ambiente.

La funzione restituisce un valore di *sessioni. CookieStore tipo che rappresenta il cookie store protetto con la chiave segreta. Userai il CookieStore funzione nel tuo Accedere e disconnettersi gestori per autenticare gli utenti e assegnare sessioni.

La funzione del gestore di accesso

Ti consigliamo di verificare se l'utente ha già effettuato l'accesso prima di creare una sessione nella funzione del gestore di accesso. Puoi usare il Ottenere metodo sul cookie store per recuperare una sessione dal cookie e aggiungere la sessione alla richiesta del cliente.

Il Ottenere restituisce la sessione e un errore che puoi gestire. Se è necessario autenticare l'utente, è possibile autenticare o autorizzare nel file Accedere gestore.

// il gestore dell'accesso recupera la sessione dal cookie Store
funzAccedere(scrittore http. ResponseWriter, richiesta *http. Richiesta) {
sessione, err := cookieStore().Get (richiesta, "Nome cookie da richiesta")

Se ehm!= zero {
tronco d'albero. Fatalln (err)
}

// imposta qui l'autenticazione utente in base all'operazione
sessione. Valori["stato di autenticazione"] = VERO
err = sessione. Salva (richiesta, scrittore)

Se ehm!= zero {
Restituzione
}
}

La proprietà Values ​​conserva i dati relativi alla sessione nel cookie store:

Il Salva il metodo salva la sessione nel cookie store. Nei tuoi gestori, avrai bisogno di altre misure di autenticazione per una maggiore sicurezza.

Verifica dello stato di accesso di un utente

Il tuo gestore di verifica dovrebbe recuperare la sessione dal cookie del cliente utilizzando il cookie store Ottenere metodo. Quindi puoi recuperare la sessione e autenticare l'utente.

funzcheckAuthStatus(scrittore http. ResponseWriter, richiesta *http. Richiesta) {
sessione, err := cookieStore().Get (richiesta, "Nome cookie da richiesta")

Se ehm!= zero {
tronco d'albero. Fatalln (err)
}

autenticato := sessione. Valori["stato di autenticazione"]

Se autenticato == VERO {
scrittore. WriteHeader (http. StatoOK) // scrivi 200 codice di stato
Restituzione
} altro {
scrittore. WriteHeader (http. StatoBadRichiesta) // scrivi il codice di stato 400 http
Restituzione
}
}

Il autenticato la variabile usa il I valori proprietà per recuperare lo stato dal cookie store. L'istruzione if verifica quindi questo stato di autenticazione. Se valuta VERO, il cliente riceve i 200 Codice di stato HTTP. Se lo stato di autenticazione non è true, il client riceve il codice di stato HTTP 400.

Il gestore del logout della sessione

La funzione del gestore di logout sarà molto simile alla funzione del gestore di accesso. Eliminerai tutti i dati relativi alla sessione dell'utente dal cookie store e annullerai lo stato di autenticazione.

funzdisconnettersi(scrittore http. ResponseWriter, richiesta *http. Richiesta) {
sessione, err := cookieStore().Get (richiesta, "Nome cookie da richiesta")

Se ehm!= zero {
Restituzione
}

// annulla la sessione dell'utente dal cookie Store
sessione. Valori["stato di autenticazione"] = falso
err = sessione. Salva (richiesta, scrittore)

Se ehm!= zero {
Restituzione
}
}

Il disconnettersi la funzione del gestore annulla lo stato di autenticazione della sessione dell'utente e salva lo stato nel cookie store.

Non archiviare dati sensibili nelle sessioni

Le sessioni sono ottime per archiviare i dati, ma è meglio evitare di archiviare dati sensibili al loro interno. Un utente malintenzionato può dirottare una sessione se memorizzi i suoi dati in un cookie e lo invii tramite un semplice HTTP. La sicurezza della tua app è importante per i tuoi utenti.

Le sessioni sono stateful e ci sono molte implementazioni di database di cookie store per il pacchetto Gorilla, sia per database SQL che NoSQL.