Sesije su popularna opcija za autentifikaciju korisnika na webu. Sesija je razdoblje tijekom kojeg korisnik aktivno radi s aplikacijom. Životni vijek sesije počinje kada se korisnik prijavi i završava kada se odjavi.

HTTP je protokol bez statusa, pa ćete često morati ručno pratiti aktivnost korisnika.

Na strani poslužitelja vaše aplikacije možete generirati jedinstvenu vrijednost, po mogućnosti kriptografski sigurnu. Zatim to možete pohraniti u kolačić koji će klijent poslati vašoj aplikaciji na buduće zahtjeve, stvarajući oblik stanja.

Sesije u Go

Možete koristiti net/http paket za implementaciju sesija, a postoji mnogo dostupnih paketa koji to već rade. Najpopularniji je paket Gorilla sessions. Ovaj paket pruža funkciju pohrane kolačića i datoteka uz prilagođenu pozadinsku infrastrukturu sesije.

Pokrenite ovu naredbu na svom Go radnom prostoru da biste instalirali paket Gorilla sessions.

ići dobiti github.com/gorilla/sessions

U ovom vodiču koristit ćete pohranu kolačića za sesije. Koristit ćete net/http paket za pokretanje web poslužitelja koji će provjeriti korisnikov problem i opozvati sesije.

instagram viewer

Evo popisa uvoza koji će vam trebati za praćenje ovog vodiča.

uvoz (
"github.com/gorilla/sessions"
"log"
"net/http"
)

The log Paket je za operacije povezane sa zapisivanjem na temelju statusa autentifikacije korisnika.

Jednostavna implementacija trgovine kolačića

Trebat će vam spremište kolačića za vaše funkcije rukovatelja prijavom i odjavom. Za svoju pohranu kolačića trebat će vam tajni ključ za autentifikaciju.

Evo funkcije za implementaciju pohrane kolačića.

// funkcija cookieStore stvara pohranu kolačića s tajnim ključem korisnika
funkCookieStore() *sjednice.CookieStore {
Tajni ključ := []bajt("super-tajni-tajni ključ")
cookieStore := sesije. NewCookieStore (SecretKey)

// funkcija vraća pohranu kolačića tako da joj druge funkcije mogu pristupiti
povratak CookieStore
}

u CookieStore funkcija, deklarirana varijabla tajnog ključa SecretKey je primjer tajnog ključa. U proizvodnji bi vaš tajni ključ trebao biti kriptografski siguran, na primjer pomoću kripto paketa. Također biste trebali učitati tajnu iz datoteka s varijablama okruženja.

Funkcija vraća vrijednost od *sjednice. CookieStore tip koji predstavlja pohranu kolačića osiguranu tajnim ključem. Vi ćete koristiti CookieStore funkcija u vašem prijaviti se i Odjavite se rukovatelji za autentifikaciju korisnika i dodjeljivanje sesija.

Funkcija rukovatelja prijavom

Trebali biste provjeriti je li korisnik već prijavljen prije stvaranja sesije u vašoj funkciji rukovatelja prijavom. Možete koristiti Dobiti metoda na spremištu kolačića za dohvaćanje sesije iz kolačića i dodavanje sesije zahtjevu klijenta.

The Dobiti metoda vraća sesiju i pogrešku koju možete riješiti. Ako trebate autentificirati korisnika, možete autentificirati ili autorizirati u prijaviti se rukovatelj.

// rukovatelj prijavom dohvaća sesiju iz spremišta kolačića
funkprijaviti se(pisac http. ResponseWriter, zahtjev *http. Zahtjev) {
session, err := cookieStore().Get (zahtjev, "Naziv kolačića iz zahtjeva")

ako pogriješiti != nula {
log. Fataln (greška)
}

// ovdje postavite svoju korisničku provjeru autentičnosti na temelju operacije
sjednica. Vrijednosti["auth status"] = pravi
pogreška = sesija. Spremi (zahtjev, pisac)

ako pogriješiti != nula {
povratak
}
}

Svojstvo Values ​​sadrži podatke povezane sa sesijom u spremištu kolačića:

The Uštedjeti metoda sprema sesiju u pohranu kolačića. U vašim rukovateljima trebat ćete druge mjere provjere autentičnosti za veću sigurnost.

Provjera statusa prijave korisnika

Vaš voditelj provjere trebao bi dohvatiti sesiju iz kolačića klijenta pomoću pohrane kolačića Dobiti metoda. Zatim možete dohvatiti sesiju i autentificirati korisnika.

funkprovjeriAuthStatus(pisac http. ResponseWriter, zahtjev *http. Zahtjev) {
session, err := cookieStore().Get (zahtjev, "Naziv kolačića iz zahtjeva")

ako pogriješiti != nula {
log. Fataln (greška)
}

autentificirana := sesija. Vrijednosti["auth status"]

ako ovjeren == pravi {
pisac. WriteHeader (http. Status OK) // napiši statusni kod 200
povratak
} drugo {
pisac. WriteHeader (http. StatusBadRequest) // napišite 400 http statusni kod
povratak
}
}

The ovjeren varijabla koristi Vrijednosti svojstvo za dohvaćanje statusa iz pohrane kolačića. Naredba if tada provjerava ovaj status provjere autentičnosti. Ako procjenjuje na pravi, klijent dobiva 200 HTTP statusni kod. Ako status provjere autentičnosti nije istinit, klijent prima 400 HTTP statusni kod.

Rukovatelj odjavom iz sesije

Vaša funkcija rukovatelja odjavom bit će vrlo slična funkciji rukovatelja prijavom. Izbrisat ćete sve podatke koji se odnose na sesiju korisnika iz pohrane kolačića i poništiti status provjere autentičnosti.

funkOdjavite se(pisac http. ResponseWriter, zahtjev *http. Zahtjev) {
session, err := cookieStore().Get (zahtjev, "Naziv kolačića iz zahtjeva")

ako pogriješiti != nula {
povratak
}

// poništavanje korisničke sesije iz trgovine kolačića
sjednica. Vrijednosti["auth status"] = lažno
pogreška = sesija. Spremi (zahtjev, pisac)

ako pogriješiti != nula {
povratak
}
}

The Odjavite se funkcija rukovatelja poništava status autentifikacije sesije korisnika i sprema status u pohranu kolačića.

Nemojte pohranjivati ​​osjetljive podatke u sesijama

Sesije su izvrsne za pohranjivanje podataka, ali najbolje je izbjegavati pohranjivanje osjetljivih podataka u njima. Napadač može oteti sesiju ako njegove podatke pohranite u kolačić i pošaljete ih putem običnog HTTP-a. Sigurnost vaše aplikacije važna je za vaše korisnike.

Sesije su sa stanjem i postoje mnoge implementacije baze podataka pohranjivanja kolačića za Gorilla paket, i za SQL i za NoSQL baze podataka.