Middleware, atsijungimas = vienas DELETE
Praeitą pamoką galėjai užsiregistruoti ir gauti sesijos slapuką — bet programa į jį nereagavo. Ši pamoka sesijas paverčia tikromis: „prisijungęs" antraštė, prisijungimo puslapis, atsijungimas ir apsaugotas skydelis.
Du middleware. Middleware apgaubia kiekvieną užklausą. Pridedam du:
LoadUserveikia kiekviename maršrute. Jis perskaito sesijos slapuką, paverčia jį vartotoju ir įdeda tą vartotoją į užklausos kontekstą. Jis niekada nieko neblokuoja — anoniminė užklausa tiesiog praeina neanotuota. Po jo bet kuris apdorotojas gali paklaustiUserFrom(r.Context())„kas tai?"RequireAuthapgaubia tik apsaugotus maršrutus. Jei kontekste nėra vartotojo, nukreipia į/login. Taip/dashboardtampa tik nariams, viena eilute:pr.Use(h.RequireAuth).
Tas padalinimas — anotuok visur, saugok pasirinktinai — yra standartinė sesijų autentifikacijos forma serveryje atvaizduojamoje programoje.
Prisijungimas simetriškas registracijai. Rask vartotoją pagal el. paštą, CheckPassword prieš saugomą bcrypt maišą, o pavykus — Sessions.Create, tas pats kvietimas kaip registracijoje. Bet viena subtilybė:
Nuskaitymo apsauga. Prisijungimas naudoja vieną bendrą klaidą kiekvienam nesėkmės atvejui: nežinomas el. paštas ir neteisingas slaptažodis grąžina „Invalid email or password." Jei „nėra tokio vartotojo" ir „neteisingas slaptažodis" duotų skirtingus pranešimus, įsilaužėlis galėtų sužinoti, kurie el. paštai turi paskyras, vien stebėdamas atsakymus. Tas pats principas saugos slaptažodžio atstatymą 7 pamokoje (patvirtinimas vienodas nepriklausomai, ar el. paštas egzistuoja).
Atsijungimas — visas serverio pusės sesijų argumentas. Tai viena eilutė: Sessions.Destroy → DELETE FROM sessions WHERE token_hash = $1. Sesija dingusi — akimirksniu, serveryje, nesuklastojamai. JWT to negali. Bevalstybis žetonas galioja iki galiojimo pabaigos; nėra serverio įrašo, kurį ištrinti, tad „atsijungti" JWT reiškia papildomą mechanizmą (trumpi galiojimai + refresh žetonai, arba juodąjį sąrašą, kurį tikrini kiekvienoje užklausoje). SignFlow atšaukia vienu DELETE, nes valdo būseną. Įsimink tai — 14 pamoka daro tai centriniu tašku.
Ši pamoka:
LoadUser+RequireAuth+Navmodelis ir maketo antraštė, atspindinti prisijungimo būseną.- Prisijungimas, atsijungimas ir
RequireAuthsaugomas skydelis.