Sessies zijn een populaire optie voor gebruikersauthenticatie op internet. Een sessie is een periode waarin een gebruiker actief bezig is met een applicatie. De levensduur van een sessie begint wanneer een gebruiker inlogt en eindigt wanneer hij uitlogt.
HTTP is een staatloos protocol, dus u zult de gebruikersactiviteit vaak handmatig moeten volgen.
Aan de serverkant van uw applicatie kunt u een unieke waarde genereren, bij voorkeur een cryptografisch veilige. U kunt dat vervolgens opslaan in een cookie die de klant bij toekomstige verzoeken naar uw app zal sturen, waardoor een staatsvorm ontstaat.
Sessies in Go
U kunt het net/http-pakket gebruiken om sessies te implementeren, en er zijn veel beschikbare pakketten die dit al doen. De meest populaire is het Gorilla-sessies-pakket. Dit pakket biedt functionaliteit voor het opslaan van cookies en bestanden naast een aangepaste backend-infrastructuur voor sessies.
Voer deze opdracht uit op uw Go-werkruimte om het Gorilla-sessiespakket te installeren.
Gaan download github.com/gorilla/sessions
In deze tutorial gebruik je een cookie store voor sessies. U gebruikt het net/http-pakket om een webserver te starten die het probleem van de gebruiker controleert en sessies intrekt.
Hier is de lijst met importen die u nodig hebt om deze zelfstudie te volgen.
importeren (
"github.com/gorilla/sessions"
"logboek"
"net/http"
)
De log pakket is voor logging-gerelateerde bewerkingen op basis van de status van de authenticatie van de gebruiker.
Een eenvoudige Cookie Store-implementatie
U hebt een cookie-opslag nodig voor uw in- en uitlogfuncties. Voor uw cookie-opslag heeft u een geheime sleutel nodig voor authenticatie.
Hier is een functie voor de implementatie van de cookie-winkel.
// cookieStore-functie maakt een cookie-winkel aan met de geheime sleutel van de gebruiker
funccookieStore() *sessies.CookieStore {
Geheime Sleutel := []byte("supergeheime-geheime sleutel")
cookieStore := sessies. NieuwCookieStore (SecretKey)
// functie retourneert de cookie-winkel zodat andere functies er toegang toe hebben
opbrengst cookieStore
}
In de cookieStore functie, de gedeclareerde geheime sleutelvariabele Geheime sleutel is een voorbeeld van een geheime sleutel. In productie moet uw geheime sleutel cryptografisch veilig zijn, bijvoorbeeld met behulp van het cryptopakket. Je moet het geheim ook laden van een bestand met omgevingsvariabelen.
De functie retourneert een waarde van de *sessies. CookieStore type dat de cookie-opslag vertegenwoordigt die is beveiligd met de geheime sleutel. Je gebruikt de CookieStore functie in je Log in en uitloggen handlers om gebruikers te authenticeren en sessies toe te wijzen.
De Login Handler Functie
U wilt controleren of de gebruiker al is ingelogd voordat u een sessie aanmaakt in uw login-handlerfunctie. U kunt de Krijgen methode in de cookiestore om een sessie uit de cookie op te halen en de sessie toe te voegen aan het verzoek van de klant.
De Krijgen methode retourneert de sessie en een fout die u kunt verwerken. Als u de gebruiker moet authenticeren, kunt u authenticeren of autoriseren in de Log in afhandelaar.
// login-handler haalt de sessie op uit de cookie Store
funcLog in(schrijver http. ResponseWriter, verzoek *http. Verzoek) {
sessie, err := cookieStore().Get (verzoek, "Cookienaam van verzoek")als fout != nul {
logboek. Fataal (fout)
}// stel hier uw gebruikersauthenticatie in op basis van de bewerking
sessie. Waarden["authenticatiestatus"] = WAAR
err = sessie. Opslaan (verzoek, schrijver)
als fout != nul {
opbrengst
}
}
De eigenschap Waarden bevat de sessiegerelateerde gegevens in de cookieopslag:
De Opslaan methode slaat de sessie op in de cookie-winkel. In uw handlers hebt u andere authenticatiemaatregelen nodig voor een betere beveiliging.
De inlogstatus van een gebruiker verifiëren
Uw verificatie-handler moet de sessie ophalen uit de cookie van de klant met behulp van de cookie store's Krijgen methode. Vervolgens kunt u de sessie ophalen en de gebruiker authenticeren.
funccheckAuthStatus(schrijver http. ResponseWriter, verzoek *http. Verzoek) {
sessie, err := cookieStore().Get (verzoek, "Cookienaam van verzoek")als fout != nul {
logboek. Fataal (fout)
}geauthenticeerd := sessie. Waarden["authenticatiestatus"]
als geauthenticeerd == WAAR {
auteur. WriteHeader (http. StatusOK) // schrijf 200 statuscode
opbrengst
} anders {
auteur. WriteHeader (http. StatusSlechtRequest) // schrijf 400 http-statuscode
opbrengst
}
}
De geauthenticeerd variabele gebruikt de Waarden eigenschap om de status op te halen uit de cookie store. De if-instructie verifieert vervolgens deze authenticatiestatus. Als het evalueert naar WAAR, de klant ontvangt de 200 HTTP-statuscode. Als de authenticatiestatus niet waar is, ontvangt de client de 400 HTTP-statuscode.
De afmeldingshandler voor sessies
Uw logout-handlerfunctie zal erg lijken op de login-handlerfunctie. U verwijdert alle gegevens met betrekking tot de sessie van de gebruiker uit de cookie-opslag en maakt de authenticatiestatus ongeldig.
funcuitloggen(schrijver http. ResponseWriter, verzoek *http. Verzoek) {
sessie, err := cookieStore().Get (verzoek, "Cookienaam van verzoek")als fout != nul {
opbrengst
}// annuleer de sessie van de gebruiker uit de cookie Store
sessie. Waarden["authenticatiestatus"] = vals
err = sessie. Opslaan (verzoek, schrijver)
als fout != nul {
opbrengst
}
}
De uitloggen handler-functie maakt de authenticatiestatus van de sessie van de gebruiker ongeldig en slaat de status op in de cookie-opslag.
Sla geen gevoelige gegevens op in sessies
Sessies zijn geweldig voor het opslaan van gegevens, maar het is het beste om te voorkomen dat er gevoelige gegevens in worden opgeslagen. Een aanvaller kan een sessie kapen als u de gegevens opslaat in een cookie en deze via gewone HTTP verzendt. De beveiliging van uw app is belangrijk voor uw gebruikers.
Sessies zijn stateful en er zijn veel database-implementaties van cookie-archieven voor het Gorilla-pakket, voor zowel SQL- als NoSQL-databases.