Tema
/
Interneto svetainių serverio dalies kūrimas GO

Forgot ir reset nuo pradžios iki galo

Dabar pats srautas. Keturi failai kaip skirtukai: auth.templutil.goauth.gorouter.go. Visi — pakeitimai.

1. internal/web/auth.templ (modify) — prisijungia trys šablonai: Forgot (el. pašto forma + bendras patvirtinimas), ResetPassword (naujo slaptažodžio forma) ir ResetInvalid (pasibaigęs/panaudotas/nėra). Kiekvienas neša CSRF lauką, kaip kiekviena forma nuo 6 pamokos.

2. internal/handlers/util.go (modify) — vienas pagalbininkas, chiURLParam, {token} iš URL perskaityti.

3. internal/handlers/auth.go (modify) — apdorotojai. Forgot rodo tą patį patvirtinimą abiem atvejais ir dirba tikrą darbą tik jei paskyra egzistuoja; sendResetLink sukuria žetoną ir siunčia laišką; Reset patikrina, atnaujina slaptažodį, tada viską sudegina:

h.Queries.UpdateUserPassword(...)         // nauja maiša
h.Queries.MarkPasswordResetUsed(prt.ID)   // šis žetonas: panaudotas
h.Queries.InvalidateUserPasswordResets(...) // bet kurie kiti atstatymo žetonai: panaudoti
h.Queries.DeleteSessionsForUser(...)      // kiekviena sesija: dingusi

4. internal/handlers/router.go (modify) — keturi maršrutai: GET/POST /forgot, GET/POST /reset/{token}.

Patikrink — visas srautas, be API rakto. sqlc generate && templ generate && go run ./cmd/signflow, tada:

  1. Prisijunk antru įrenginiu (ar privačiu langu), kad paskyra turėtų dvi sesijas: SELECT count(*) FROM sessions → 2.

  2. Eik į /loginForgot your password? → įvesk el. paštą → pateik. Matai bendrą patvirtinimą. Dabar pažiūrėk į serverio terminalą:

    ┌──────────────────────────────────────────────────────────────
    │ 📧  DEV EMAIL (not actually sent)
    │ To:      you@example.com
    │ Subject: Reset your SignFlow password
    ├──────────────────────────────────────────────────────────────
    │ Someone requested a password reset for your SignFlow account.
    │
    │ Reset your password (link valid for 1 hour):
    │ http://localhost:8080/reset/Ck3p9x2...
    │
    │ If this wasn't you, you can safely ignore this email.
    └──────────────────────────────────────────────────────────────
    

    Švari, skaitoma dėžutė — štai fmt.Fprintf-į-stdout sprendimas atsiperka. Nukopijuok nuorodą.

  3. Atidaryk ją, nustatyk naują slaptažodį, pateik → nukreiptas į /login. Dabar atpildas:

    $ psql signflow -c "SELECT count(*) FROM sessions;"
     count
    -------
         0          ← ABI sesijos dingusios. Slaptažodžio keitimas atjungė kiekvieną įrenginį.
    

    Prisijunk su nauju slaptažodžiu — veikia. Senas nebe.

  4. Vienkartinis. Perkrauk ką tik panaudotą atstatymo nuorodą → „This reset link is invalid" puslapis. used_at nustatytas, tad GetValidPasswordReset nieko negrąžina.

Spąstai (nuskaitymas). Pateik /forgot su el. paštu, kuris niekada nebuvo užregistruotas. Gauni lygiai tą patį patvirtinimą — „jei paskyra egzistuoja, išsiuntėm nuorodą." — o terminalas tyli (jokio laiško, nes sendResetLink nieko nedaro su nežinomu adresu). Įsilaužėlis nesužino nieko apie tai, kas turi paskyrą.