Sessioner er en populær mulighed for brugergodkendelse på tværs af nettet. En session er en periode, hvor en bruger aktivt engagerer sig i en applikation. En sessions levetid begynder, når en bruger logger på, og slutter, når de logger ud.
HTTP er en statsløs protokol, så du bliver ofte nødt til at spore brugeraktivitet manuelt.
På serversiden af din applikation kan du generere en unik værdi, helst en kryptografisk sikker. Du kan derefter gemme det i en cookie, som klienten sender til din app på fremtidige anmodninger, hvilket skaber en tilstandsform.
Sessioner i Go
Du kan bruge net/http-pakken til at implementere sessioner, og der er mange tilgængelige pakker, der allerede gør dette. Den mest populære er Gorilla-sessionspakken. Denne pakke giver cookie- og fillagringsfunktionalitet sammen med brugerdefineret session backend-infrastruktur.
Kør denne kommando på dit Go-arbejdsområde for at installere Gorilla-sessionspakken.
gå få github.com/gorilla/sessions
I denne vejledning skal du bruge en cookiebutik til sessioner. Du skal bruge net/http-pakken til at starte en webserver, der kontrollerer brugerens problem og tilbagekalder sessioner.
Her er listen over importer, du skal bruge for at følge denne vejledning.
importere (
"github.com/gorilla/sessions"
"log"
"net/http"
)
Det log pakken er til logføringsrelaterede operationer baseret på status for brugerens godkendelse.
En simpel implementering af Cookie Store
Du skal bruge et cookielager til dine login- og logout-håndteringsfunktioner. Til din cookiebutik skal du bruge en hemmelig nøgle til godkendelse.
Her er en funktion til implementering af cookiebutik.
// cookieStore-funktionen opretter et cookielager med brugerens hemmelige nøgle
funccookieStore() *sessioner.CookieStore {
Secret Key := []byte("super-hemmelig-hemmelig nøgle")
cookieStore := sessioner. NewCookieStore (SecretKey)
//-funktionen returnerer cookie-lageret, så andre funktioner kan få adgang til det
Vend tilbage cookieStore
}
I den cookieStore funktion, den erklærede hemmelige nøglevariabel Secret Key er et eksempel på en hemmelig nøgle. I produktionen skal din hemmelige nøgle være kryptografisk sikker, f.eks. ved hjælp af kryptopakken. Du bør også indlæse hemmeligheden fra en fil med miljøvariabler.
Funktionen returnerer en værdi af * sessioner. CookieStore type, som repræsenterer cookie-lageret, der er sikret med den hemmelige nøgle. Du vil bruge CookieStore funktion i din Log på og Log ud handlere til at godkende brugere og tildele sessioner.
Login Handler-funktionen
Du vil gerne bekræfte, om brugeren allerede er logget ind, før du opretter en session i din login-håndteringsfunktion. Du kan bruge Få metode på cookie-lageret for at hente en session fra cookien og tilføje sessionen til kundens anmodning.
Det Få metoden returnerer sessionen og en fejl, du kan håndtere. Hvis du har brug for at godkende brugeren, kan du godkende eller godkende i Log på handler.
// login-handler henter sessionen fra cookie-lageret
funcLog på(forfatter http. ResponseWriter, anmod om *http. Anmodning) {
session, err := cookieStore().Hent (anmodning, "Cookienavn fra anmodning")hvis fejl!= nul {
log. Fatalln (fejl)
}// indstil din brugergodkendelse her baseret på handlingen
session. Værdier["godkendelsesstatus"] = rigtigt
fejl = session. Gem (anmodning, skribent)
hvis fejl!= nul {
Vend tilbage
}
}
Egenskaben Værdier indeholder de sessionsrelaterede data i cookie-lageret:
Det Gemme metoden gemmer sessionen i cookie-lageret. I dine handlere har du brug for andre godkendelsesforanstaltninger for højere sikkerhed.
Bekræftelse af en brugers loginstatus
Din verifikationshandler bør hente sessionen fra kundens cookie ved hjælp af cookiebutikkens Få metode. Derefter kan du hente sessionen og autentificere brugeren.
funccheckAuthStatus(forfatter http. ResponseWriter, anmod om *http. Anmodning) {
session, err := cookieStore().Hent (anmodning, "Cookienavn fra anmodning")hvis fejl!= nul {
log. Fatalln (fejl)
}autentificeret := session. Værdier["godkendelsesstatus"]
hvis godkendt == rigtigt {
forfatter. WriteHeader (http. Status OK) // skriv 200 statuskode
Vend tilbage
} andet {
forfatter. WriteHeader (http. StatusBadRequest) // skriv 400 http statuskode
Vend tilbage
}
}
Det autentificeret variabel bruger Værdier ejendom for at hente status fra cookie-lageret. If-erklæringen bekræfter derefter denne godkendelsesstatus. Hvis det vurderes til rigtigt, modtager kunden 200 HTTP-statuskode. Hvis godkendelsesstatussen ikke er sand, modtager klienten 400 HTTP-statuskoden.
Session Logout Handler
Din logout-håndteringsfunktion vil ligne login-håndteringsfunktionen meget. Du sletter alle data relateret til brugerens session fra cookie-lageret og annullerer autentificeringsstatussen.
funcLog ud(forfatter http. ResponseWriter, anmod om *http. Anmodning) {
session, err := cookieStore().Hent (anmodning, "Cookienavn fra anmodning")hvis fejl!= nul {
Vend tilbage
}// annullere brugerens session fra cookiebutikken
session. Værdier["godkendelsesstatus"] = falsk
fejl = session. Gem (anmodning, skribent)
hvis fejl!= nul {
Vend tilbage
}
}
Det Log ud handlerfunktion annullerer brugerens sessionsgodkendelsesstatus og gemmer status i cookie-lageret.
Gem ikke følsomme data i sessioner
Sessioner er gode til at gemme data, men det er bedst at undgå at gemme følsomme data i dem. En angriber kan kapre en session, hvis du gemmer dens data i en cookie og sender dem over almindelig HTTP. Sikkerheden af din app er vigtig for dine brugere.
Sessioner er stateful, og der er mange databaseimplementeringer af cookie-butikker til Gorilla-pakken, for både SQL- og NoSQL-databaser.