Sesiunile sunt o opțiune populară pentru autentificarea utilizatorilor pe web. O sesiune este o perioadă în care un utilizator se interacționează activ cu o aplicație. Durata de viață a unei sesiuni începe atunci când un utilizator se conectează și se termină când se deconectează.
HTTP este un protocol fără stat, așa că va trebui adesea să urmăriți manual activitatea utilizatorului.
Pe partea de server a aplicației dvs., puteți genera o valoare unică, de preferință una sigură criptografic. Apoi îl puteți stoca într-un cookie pe care clientul îl va trimite aplicației dvs. la solicitările viitoare, creând o formă de stare.
Sesiuni în Go
Puteți utiliza pachetul net/http pentru a implementa sesiuni și există multe pachete disponibile care deja fac acest lucru. Cel mai popular este pachetul de sesiuni Gorilla. Acest pachet oferă cookie-uri și funcționalitate de stocare a fișierelor alături de infrastructura de backend personalizată a sesiunii.
Rulați această comandă în spațiul de lucru Go pentru a instala pachetul de sesiuni Gorilla.
merge obțineți github.com/gorilla/sessions
În acest tutorial, veți folosi un magazin de cookie-uri pentru sesiuni. Veți folosi pachetul net/http pentru a porni un server web care va verifica problema utilizatorului și va revoca sesiunile.
Iată lista de importuri de care veți avea nevoie pentru a urma acest tutorial.
import (
„github.com/gorilla/sessions”
"Buturuga"
"net/http"
)
The Buturuga pachetul este pentru operațiuni legate de jurnal, bazate pe starea de autentificare a utilizatorului.
O implementare simplă a magazinului de cookie-uri
Veți avea nevoie de un depozit de cookie-uri pentru funcțiile dvs. de gestionare a autentificare și deconectare. Pentru magazinul de cookie-uri, veți avea nevoie de o cheie secretă pentru autentificare.
Iată o funcție pentru implementarea depozitului de cookie-uri.
// Funcția cookieStore creează un depozit de cookie-uri cu cheia secretă a utilizatorului
funccookieStore() *sesiuni.CookieStore {
SecretKey := []octet("super-secret-SecretKey")
cookieStore := sesiuni. NewCookieStore (SecretKey)
// funcția returnează depozitul de cookie-uri, astfel încât alte funcții să îl poată accesa
întoarcere cookieStore
}
În cookieStore funcția, variabila cheie secretă declarată Cheie secreta este un exemplu de cheie secretă. În producție, cheia dvs. secretă ar trebui să fie securizată criptografic, folosind pachetul criptografic, de exemplu. Ar trebui să încărcați și secretul de la un fișier cu variabile de mediu.
Funcția returnează o valoare a lui *sesiuni. CookieStore tip care reprezintă depozitul de cookie-uri securizat cu cheia secretă. Veți folosi CookieStore funcția în dvs Autentificare și deconectare handlere pentru a autentifica utilizatorii și a atribui sesiuni.
Funcția de gestionare a autentificării
Veți dori să verificați dacă utilizatorul este deja conectat înainte de a crea o sesiune în funcția de gestionare a autentificarii. Puteți folosi obține metoda din magazinul de cookie-uri pentru a prelua o sesiune din modul cookie și pentru a adăuga sesiunea la cererea clientului.
The obține metoda returnează sesiunea și o eroare pe care o puteți gestiona. Dacă trebuie să autentificați utilizatorul, vă puteți autentifica sau autoriza în Autentificare manipulator.
// handlerul de autentificare preia sesiunea din magazinul de cookie-uri
funcAutentificare(scriitor http. ResponseWriter, solicitați *http. Cerere) {
session, err := cookieStore().Get (cerere, „Cookie Name From Request”)dacă greș!= zero {
Buturuga. Fatalln (eră)
}// setați aici autentificarea utilizatorului pe baza operației
sesiune. Valori[„statut de autorizare”] = Adevărat
err = sesiune. Salvare (solicitare, scriitor)
dacă greș!= zero {
întoarcere
}
}
Proprietatea Values deține datele legate de sesiune în depozitul de cookie-uri:
The Salvați metoda salvează sesiunea în magazinul de cookie-uri. În handlere, veți avea nevoie de alte măsuri de autentificare pentru o securitate mai mare.
Verificarea stării de conectare a unui utilizator
Managerul dvs. de verificare ar trebui să recupereze sesiunea din cookie-ul clientului folosind magazinul de cookie-uri obține metodă. Apoi puteți prelua sesiunea și puteți autentifica utilizatorul.
funccheckAuthStatus(scriitor http. ResponseWriter, solicitați *http. Cerere) {
session, err := cookieStore().Get (cerere, „Cookie Name From Request”)dacă greș!= zero {
Buturuga. Fatalln (eră)
}autentificat := sesiune. Valori[„statut de autorizare”]
dacă autentificat == Adevărat {
scriitor. WriteHeader (http. StareOK) // scrie codul de stare 200
întoarcere
} altfel {
scriitor. WriteHeader (http. StatusBadRequest) // scrie codul de stare 400 http
întoarcere
}
}
The autentificat variabila folosește Valori proprietate pentru a prelua starea din depozitul de cookie-uri. Declarația if verifică apoi această stare de autentificare. Dacă se evaluează la Adevărat, clientul primește 200 Cod de stare HTTP. Dacă starea de autentificare nu este adevărată, clientul primește codul de stare HTTP 400.
Handler-ul de deconectare a sesiunii
Funcția de gestionare a deconectarii va fi foarte asemănătoare cu funcția de gestionare a autentificarii. Veți șterge toate datele legate de sesiunea utilizatorului din magazinul de cookie-uri și veți anula starea de autentificare.
funcdeconectare(scriitor http. ResponseWriter, solicitați *http. Cerere) {
session, err := cookieStore().Get (cerere, „Cookie Name From Request”)dacă greș!= zero {
întoarcere
}// anulează sesiunea utilizatorului din magazinul de cookie-uri
sesiune. Valori[„statut de autorizare”] = fals
err = sesiune. Salvare (solicitare, scriitor)
dacă greș!= zero {
întoarcere
}
}
The deconectare funcția de gestionare anulează starea de autentificare a sesiunii a utilizatorului și salvează starea în depozitul de cookie-uri.
Nu stocați date sensibile în sesiuni
Sesiunile sunt excelente pentru stocarea datelor, dar cel mai bine este să evitați stocarea datelor sensibile în ele. Un atacator poate deturna o sesiune dacă îi stocați datele într-un cookie și le trimiteți prin HTTP simplu. Securitatea aplicației dvs. este importantă pentru utilizatorii dvs.
Sesiunile sunt cu stare și există multe implementări de baze de date ale depozitelor de cookie-uri pentru pachetul Gorilla, atât pentru bazele de date SQL, cât și pentru NoSQL.