feat(2fa): rezervni (jednokratni) kodovi za 2FA
Alternativa TOTP-u kada uređaj nije dostupan. Po CLAUDE.md specifikaciji: 10 kodova pri aktivaciji, čuvani kao bcrypt heš. Backend: - migracija 039 (tabela rezervni_kodovi, FK CASCADE) - auth.GenerisiRezervneKodove (Crockford base32, XXXX-XXXX) + NormalizujRezervniKod - RezervniKodoviRepository (Zameni/Iskoristi/BrojPreostalih/Obrisi) + SQLite impl - žičenje u Handler (+ reinicijalizuj) Prijava: - VerifikujTotp prvo proba TOTP, pa rezervni kod (isto polje); kod je jednokratni - totp_provera.html: input opušten (slova/crtica), napomena o rezervnom kodu Profil: - aktivacija generiše i prikazuje kodove JEDNOM; dugme Regeneriši; brojač preostalo X/10 - deaktivacija briše kodove Testovi: auth (generisanje/format/normalizacija), repo (jednokratnost/regeneracija), prijava rezervnim kodom end-to-end. Ukupno 36 test funkcija.
This commit is contained in:
@@ -143,6 +143,15 @@ type DozvoleRepository interface {
|
||||
Reset(ctx context.Context) error
|
||||
}
|
||||
|
||||
// RezervniKodoviRepository definiše operacije nad rezervnim (jednokratnim) 2FA kodovima.
|
||||
// Kodovi se čuvaju kao bcrypt heš; Iskoristi prima čist kod i poredi ga sa hešovima.
|
||||
type RezervniKodoviRepository interface {
|
||||
Zameni(ctx context.Context, korisnikID int64, hashevi []string) error
|
||||
Iskoristi(ctx context.Context, korisnikID int64, kod string) (bool, error)
|
||||
BrojPreostalih(ctx context.Context, korisnikID int64) (int, error)
|
||||
Obrisi(ctx context.Context, korisnikID int64) error
|
||||
}
|
||||
|
||||
// IzvestajRepository definiše read-only upite za dashboard i stranicu izveštaja.
|
||||
// Vraća sirove podatke; prezentaciju (datumi, boje, rang) radi handler.
|
||||
type IzvestajRepository interface {
|
||||
|
||||
Reference in New Issue
Block a user