Oggi l’ho riconsiderato e ho scoperto che:
[25] pry(main)> how.totp_enabled?
=> false
[26] pry(main)> how.backup_codes_enabled?
=> true
[27] pry(main)> how.totp_or_backup_codes_enabled?
=> true
Quindi ho provato a rimuovere anche i codici di backup, seguendo la risposta precedente di @falco:
UserSecondFactor.backup_codes.where(user_id: id).each(&:destroy!)
Ecco ora la soluzione completa per disabilitare l’OTP per un utente che ha perso l’accesso: devi rimuovere sia le voci totps che i backup_codes, in modo che la chiamata a #totp_or_backup_codes_enabled? restituisca false.