Økter er et populært alternativ for brukerautentisering på nettet. En økt er en periode der en bruker aktivt engasjerer seg i en applikasjon. Levetiden til en økt begynner når en bruker logger på og slutter når de logger av.

HTTP er en statsløs protokoll, så du må ofte spore brukeraktivitet manuelt.

På serversiden av applikasjonen din kan du generere en unik verdi, gjerne en kryptografisk sikker. Du kan deretter lagre det i en informasjonskapsel som klienten sender til appen din ved fremtidige forespørsler, og skaper en form for tilstand.

Økter i Go

Du kan bruke net/http-pakken til å implementere økter, og det er mange tilgjengelige pakker som allerede gjør dette. Den mest populære er Gorilla-øktpakken. Denne pakken gir informasjonskapsler og fillagringsfunksjonalitet sammen med tilpasset sesjonsbackend-infrastruktur.

Kjør denne kommandoen på Go-arbeidsområdet for å installere Gorilla sessions-pakken.

 skaff deg github.com/gorilla/sessions

I denne opplæringen bruker du en informasjonskapselbutikk for økter. Du vil bruke net/http-pakken til å starte en webserver som vil sjekke brukerens problem og tilbakekalle økter.

instagram viewer

Her er listen over importer du trenger for å følge denne opplæringen.

import (
"github.com/gorilla/sessions"
"Logg"
"net/http"
)

De Logg pakken er for loggingsrelaterte operasjoner basert på statusen til brukerens autentisering.

En enkel implementering av informasjonskapsler

Du trenger en cookie-butikk for påloggings- og utloggingsfunksjonene dine. For informasjonskapselbutikken din trenger du en hemmelig nøkkel for autentisering.

Her er en funksjon for implementeringen av informasjonskapselbutikken.

// cookieStore-funksjonen lager en cookie-butikk med brukerens hemmelige nøkkel
funccookieStore() *økter.CookieStore {
Secret Key := []byte("superhemmelig-hemmelig nøkkel")
cookieStore := økter. NewCookieStore (SecretKey)

//-funksjonen returnerer informasjonskapsellageret slik at andre funksjoner kan få tilgang til det
komme tilbake cookieStore
}

I cookieStore funksjon, den erklærte hemmelige nøkkelvariabelen Secret Key er et eksempel på en hemmelig nøkkel. I produksjon skal den hemmelige nøkkelen din være kryptografisk sikker, ved å bruke kryptopakken for eksempel. Du bør også laste hemmeligheten fra en fil med miljøvariabler.

Funksjonen returnerer en verdi av *økter. CookieStore type som representerer informasjonskapsellageret sikret med den hemmelige nøkkelen. Du vil bruke CookieStore funksjon i din Logg Inn og Logg ut behandlere for å autentisere brukere og tildele økter.

Innloggingsbehandlingsfunksjonen

Du vil bekrefte om brukeren allerede er pålogget før du oppretter en økt i påloggingsbehandlingsfunksjonen. Du kan bruke metode på informasjonskapsellageret for å hente en økt fra informasjonskapselen og legge økten til kundens forespørsel.

De metoden returnerer økten og en feil du kan håndtere. Hvis du trenger å autentisere brukeren, kan du autentisere eller autorisere i Logg Inn handler.

// påloggingsbehandler henter økten fra informasjonskapselbutikken
funcLogg Inn(skribent http. ResponseWriter, be om *http. Be om) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

hvis feil!= null {
Logg. Fatalln (feil)
}

// angi brukerautentiseringen din her basert på operasjonen
økt. Verdier["auth status"] = ekte
feil = økt. Lagre (forespørsel, skribent)

hvis feil!= null {
komme tilbake
}
}

Verdier-egenskapen inneholder øktrelaterte data i informasjonskapsellageret:

De Lagre metoden lagrer økten til informasjonskapselbutikken. I behandlerne dine trenger du andre autentiseringstiltak for høyere sikkerhet.

Bekrefte en brukers påloggingsstatus

Verifikasjonsbehandleren din bør hente økten fra klientens informasjonskapsel ved hjelp av informasjonskapselbutikkens metode. Deretter kan du hente sesjonen og autentisere brukeren.

funccheckAuthStatus(skribent http. ResponseWriter, be om *http. Be om) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

hvis feil!= null {
Logg. Fatalln (feil)
}

autentisert := økt. Verdier["authortstatus"]

hvis autentisert == ekte {
forfatter. WriteHeader (http. StatusOK) // skriv 200 statuskode
komme tilbake
} ellers {
forfatter. WriteHeader (http. StatusBadRequest) // skriv 400 http statuskode
komme tilbake
}
}

De autentisert variabelen bruker Verdier eiendom for å hente statusen fra informasjonskapsellageret. If-setningen bekrefter deretter denne autentiseringsstatusen. Hvis det vurderes til ekte, mottar klienten 200 HTTP-statuskode. Hvis autentiseringsstatusen ikke er sann, mottar klienten 400 HTTP-statuskoden.

Håndteren for øktavlogging

Utloggingsbehandlerfunksjonen din vil være veldig lik påloggingsbehandlerfunksjonen. Du vil slette alle data relatert til brukerens økt fra informasjonskapsellageret og annullere autentiseringsstatusen.

funcLogg ut(skribent http. ResponseWriter, be om *http. Be om) {
session, err := cookieStore().Get (request, "Cookie Name From Request")

hvis feil!= null {
komme tilbake
}

// annullere brukerens økt fra informasjonskapselbutikken
økt. Verdier["auth status"] = falsk
feil = økt. Lagre (forespørsel, skribent)

hvis feil!= null {
komme tilbake
}
}

De Logg ut behandlerfunksjonen annullerer brukerens sesjonsautentiseringsstatus og lagrer statusen i informasjonskapsellageret.

Ikke lagre sensitive data i økter

Økter er flotte for å lagre data, men det er best å unngå å lagre sensitive data i dem. En angriper kan kapre en økt hvis du lagrer dataene i en informasjonskapsel og sender dem over vanlig HTTP. Sikkerheten til appen din er viktig for brukerne dine.

Økter er stateful og det er mange databaseimplementeringer av informasjonskapsellagre for Gorilla-pakken, for både SQL- og NoSQL-databaser.