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:
@@ -30,7 +30,7 @@
|
||||
</div>
|
||||
|
||||
<h1>Dvostepena verifikacija</h1>
|
||||
<p class="opis">Unesite 6-cifreni kod iz vaše aplikacije za autentifikaciju.</p>
|
||||
<p class="opis">Unesite 6-cifreni kod iz vaše aplikacije za autentifikaciju, ili jedan od rezervnih kodova (format XXXX-XXXX) ako nemate pristup aplikaciji.</p>
|
||||
|
||||
{{if eq .Greska "1"}}
|
||||
<div class="greska">Neispravan kod. Pokušajte ponovo.</div>
|
||||
@@ -41,8 +41,7 @@
|
||||
<div class="polje">
|
||||
<label for="kod">Kod za verifikaciju</label>
|
||||
<input type="text" id="kod" name="kod"
|
||||
inputmode="numeric" pattern="[0-9]{6}"
|
||||
maxlength="6" autocomplete="one-time-code" autofocus required>
|
||||
maxlength="12" autocomplete="one-time-code" autofocus required>
|
||||
</div>
|
||||
<button type="submit" class="dugme">Potvrdi</button>
|
||||
</form>
|
||||
|
||||
Reference in New Issue
Block a user