# 动态验证码快捷登录

登录密码后，打开账户设置中的「动态验证码快捷登录」。输入当前密码，点击绑定验证器，用验证器应用扫描页面上的二维码（标准 otpauth:// URI，时间型 TOTP、SHA-1、6 位、30 秒），无法扫码时也可展开手动密钥，然后输入当前验证码确认绑定。绑定信息五分钟后过期，未确认不会启用。

退出后选择「使用动态验证码登录」，输入用户名和当前验证码即可，无需再次输入密码。一个验证码成功使用后不能重复使用，包括绑定确认所使用的验证码；请等待下一次刷新再测试登录。允许前后一个时间步的时钟偏差，手机和服务器应同步时间。

这是验证码替代密码的快捷登录，不是密码加验证码的双因素认证。密码登录继续保留。验证器丢失时可以用密码登录，在账户设置输入当前密码停用旧验证器，然后重新绑定。

验证码登录与密码登录共享 IP 失败限流（五次失败后等待十五分钟）；绑定和停用要求已登录、CSRF 校验及密码验证，绑定确认另有限流。验证码的使用记录持久化于账户 SQLite 数据库，应用重启不会清除重复使用防护。

二维码在应用服务端本地生成并作为图片返回，不发送至第三方二维码服务。密钥存储在账户数据库中（未做应用层加密），请限制数据卷和备份访问权限；不要分享密钥。任务 JSON 导出不包含账户或验证器密钥，恢复账户需要备份 accounts.sqlite3。服务器必须通过 HTTPS 访问。

登录、注册、动态码登录使用独立表单，同一时间仅展示一个。注册成功返回密码登录页，未自动登录。

算法依据：https://www.rfc-editor.org/rfc/rfc6238

升级兼容：只给旧账户表增加 totp_secret / totp_last 列，已有账户默认未绑定；旧用户名、密码哈希、API token、主题和 JSON 数据不会被重建或覆盖。上线前请备份账户数据库，依赖中新增 Segno，Docker 需重新构建。
