Sesje to popularna opcja uwierzytelniania użytkowników w sieci. Sesja to okres, w którym użytkownik aktywnie angażuje się w aplikację. Czas trwania sesji rozpoczyna się, gdy użytkownik się loguje, a kończy, gdy się wylogowuje.
HTTP jest protokołem bezstanowym, więc często trzeba ręcznie śledzić aktywność użytkowników.
Po stronie serwera aplikacji możesz wygenerować unikalną wartość, najlepiej zabezpieczoną kryptograficznie. Następnie możesz zapisać to w pliku cookie, który klient wyśle do Twojej aplikacji przy przyszłych żądaniach, tworząc formę stanu.
Sesje w Go
Możesz użyć pakietu net/http do zaimplementowania sesji, a jest wiele dostępnych pakietów, które już to robią. Najpopularniejszym jest pakiet sesji Gorilla. Ten pakiet zapewnia funkcjonalność przechowywania plików cookie i plików wraz z niestandardową infrastrukturą zaplecza sesji.
Uruchom to polecenie w obszarze roboczym Go, aby zainstalować pakiet sesji Gorilla.
iść pobierz github.com/gorilla/sessions
W tym samouczku użyjesz magazynu plików cookie do sesji. Użyjesz pakietu net/http do uruchomienia serwera WWW, który sprawdzi problem użytkownika i odwoła sesje.
Oto lista importów, które musisz wykonać w tym samouczku.
import (
„github.com/gorilla/sesje”
"dziennik"
„sieć/http”
)
The dziennik pakiet służy do operacji związanych z logowaniem na podstawie statusu uwierzytelnienia użytkownika.
Prosta implementacja sklepu z plikami cookie
Będziesz potrzebować magazynu plików cookie dla funkcji obsługi logowania i wylogowania. Do przechowywania plików cookie potrzebny jest tajny klucz do uwierzytelniania.
Oto funkcja do wdrożenia sklepu z plikami cookie.
// Funkcja cookieStore tworzy magazyn ciasteczek z tajnym kluczem użytkownika
funkcjonowaćcookieStore() *sesje.Sklep z plikami cookie {
tajny klucz := []bajt(„super-tajny-tajny klucz”)
cookieStore := sesje. Nowy sklep z plikami cookie (tajny klucz)
// funkcja zwraca plik cookie, aby inne funkcje miały do niego dostęp
zwrócić cookieStore
}
w cookieStore funkcja, zadeklarowana zmienna klucza tajnego Sekretny klucz to przykładowy klucz tajny. W środowisku produkcyjnym Twój tajny klucz powinien być bezpieczny kryptograficznie, na przykład przy użyciu pakietu kryptograficznego. Powinieneś także załadować sekret z plik zmiennych środowiskowych.
Funkcja zwraca wartość *sesje. Sklep z plikami cookie typ, który reprezentuje magazyn ciasteczek zabezpieczony tajnym kluczem. Użyjesz Sklep z plikami cookie funkcjonować w twoim Zaloguj sie oraz Wyloguj programy obsługi do uwierzytelniania użytkowników i przypisywania sesji.
Funkcja obsługi logowania
Będziesz chciał sprawdzić, czy użytkownik jest już zalogowany przed utworzeniem sesji w funkcji obsługi logowania. Możesz użyć Dostać metoda w magazynie plików cookie, aby pobrać sesję z pliku cookie i dodać sesję do żądania klienta.
The Dostać Metoda zwraca sesję i błąd, który możesz obsłużyć. Jeśli chcesz uwierzytelnić użytkownika, możesz uwierzytelnić lub autoryzować w Zaloguj sie treser.
// obsługa logowania pobiera sesję z ciasteczka Store
funkcjonowaćZaloguj sie(pisarz http. ResponseWriter, żądanie *http. Żądanie) {
session, err := cookieStore().Get (request, "Cookie Name From Request")jeśli błąd != zero {
dziennik. Śmiertelny (błąd)
}// ustaw tutaj uwierzytelnianie użytkownika na podstawie operacji
sesja. Wartości["stan uwierzytelniania"] = PRAWDA
błąd = sesja. Zapisz (prośba, pisarz)
jeśli błąd != zero {
zwrócić
}
}
Właściwość Values przechowuje dane związane z sesją w magazynie plików cookie:
The Ratować metoda zapisuje sesję do magazynu ciasteczek. W swoich programach obsługi będziesz potrzebować innych środków uwierzytelniania, aby zwiększyć bezpieczeństwo.
Weryfikacja statusu logowania użytkownika
Twój program obsługi weryfikacji powinien pobrać sesję z pliku cookie klienta, korzystając z pliku cookie sklepu Dostać metoda. Następnie możesz pobrać sesję i uwierzytelnić użytkownika.
funkcjonowaćcheckAuthStatus(pisarz http. ResponseWriter, żądanie *http. Żądanie) {
session, err := cookieStore().Get (request, "Cookie Name From Request")jeśli błąd != zero {
dziennik. Śmiertelny (błąd)
}uwierzytelnione := sesja. Wartości["stan uwierzytelniania"]
jeśli uwierzytelnione == PRAWDA {
pisarz. Nagłówek zapisu (http. Stan OK) // wpisz kod statusu 200
zwrócić
} w przeciwnym razie {
pisarz. Nagłówek zapisu (http. StatusBadRequest) // napisz kod statusu 400 http
zwrócić
}
}
The zalegalizowany zmienna używa Wartości właściwość, aby pobrać status z magazynu plików cookie. Instrukcja if następnie weryfikuje ten stan uwierzytelniania. Jeśli ocenia się na PRAWDA, klient otrzymuje 200 Kod stanu HTTP. Jeśli stan uwierzytelnienia nie jest prawdziwy, klient otrzymuje kod stanu 400 HTTP.
Obsługa wylogowania z sesji
Twoja funkcja obsługi wylogowania będzie bardzo podobna do funkcji obsługi logowania. Usuniesz wszystkie dane związane z sesją użytkownika z magazynu plików cookie i unieważnisz status uwierzytelnienia.
funkcjonowaćWyloguj(pisarz http. ResponseWriter, żądanie *http. Żądanie) {
session, err := cookieStore().Get (request, "Cookie Name From Request")jeśli błąd != zero {
zwrócić
}// anulować sesję użytkownika z ciasteczka Store
sesja. Wartości["stan uwierzytelniania"] = fałszywy
błąd = sesja. Zapisz (prośba, pisarz)
jeśli błąd != zero {
zwrócić
}
}
The Wyloguj funkcja obsługi unieważnia stan uwierzytelnienia sesji użytkownika i zapisuje stan w magazynie plików cookie.
Nie przechowuj poufnych danych w sesjach
Sesje świetnie nadają się do przechowywania danych, ale najlepiej unikać przechowywania w nich poufnych danych. Atakujący może przejąć sesję, jeśli przechowujesz jej dane w pliku cookie i wysyłasz je przez zwykły protokół HTTP. Bezpieczeństwo Twojej aplikacji jest ważne dla Twoich użytkowników.
Sesje są stanowe i istnieje wiele implementacji baz danych przechowujących pliki cookie dla pakietu Gorilla, zarówno dla baz danych SQL, jak i NoSQL.