用户登录认证流程图

一个完整的用户登录认证流程图,涵盖了前端校验、后端安全防护(防爆破)、密码哈希比对、双因素认证(2FA)及令牌签发的完整生命周期:


认证流程图

flowchart TD
    Start(["用户发起登录"]) --> Input["输入账号、密码(及验证码)"]
    Input --> FeValid{"前端格式校验"}

    FeValid -- "校验未通过" --> FeError["前端提示格式错误"]
    FeValid -- "校验通过" --> SendReq["发起 HTTPS POST 请求"]

    SendReq --> RateLimit{"频率限制 / 防刷检查"}
    RateLimit -- "请求超限" --> Err429["返回 HTTP 429: 请求过于频繁"]

    RateLimit -- "通过" --> QueryUser{"查询用户信息"}
    QueryUser -- "用户不存在" --> GenericErr["返回模糊报错: 用户名或密码错误"]

    QueryUser -- "用户存在" --> CheckStatus{"账号状态检查"}
    CheckStatus -- "已冻结 / 禁用" --> ErrStatus["返回: 账号已被锁定/禁用"]

    CheckStatus -- "正常" --> VerifyPwd{"密码哈希比对 (如 bcrypt/argon2)"}
    VerifyPwd -- "密码错误" --> RecordFail["记录失败次数"]
    RecordFail --> CheckMaxFail{"是否达到最大错误阈值?"}
    CheckMaxFail -- "是" --> LockAcc["临时锁定账号 (如 15 分钟)"] --> GenericErr
    CheckMaxFail -- "否" --> GenericErr

    VerifyPwd -- "密码正确" --> Check2FA{"是否开启两步验证 (2FA)?"}
    
    Check2FA -- "是" --> Req2FA["返回临时凭证并要求 2FA 验证"]
    Req2FA --> Input2FA["用户输入动态验证码 (TOTP/短信/邮箱)"]
    Input2FA --> Verify2FA{"验证 2FA 码"}
    Verify2FA -- "验证失败" --> Err2FA["提示: 双重验证码不正确"]
    Verify2FA -- "验证通过" --> GenToken

    Check2FA -- "否" --> GenToken["重置失败重试计数"]
    GenToken --> IssueToken["签发 Token (Access Token + Refresh Token)"]
    IssueToken --> LogRecord["异步记录登录日志 (IP、设备、时间)"]
    LogRecord --> ReturnSuccess["返回登录成功响应"]
    ReturnSuccess --> FeSave["前端安全存储 Token 并重定向至首页"]
    FeSave --> End(["登录流程结束"])

核心安全设计要点

  1. 防账号枚举
    • 无论“用户不存在”还是“密码错误”,统一返回模糊错误提示(如 用户名或密码错误),避免攻击者探测系统中注册了哪些账号。
  2. 防爆破与防暴力破解
    • IP/接口限流:通过 Redis等实现滑动窗口限流;
    • 账号锁定机制:连续多次密码错误后临时锁定账号或增加图形验证码/人机验证。
  3. 密码安全
    • 严禁明文比对,必须使用加盐慢哈希算法(如 Argon2idbcryptPBKDF2)。
  4. **双因素认证 (2FA/MFA)**:
    • 支持 Google Authenticator (TOTP) 或短信/邮件验证码,大幅提升账户安全等级。
  5. **令牌管理 (JWT/Session)**:
    • 建议使用短期 Access Token(如 1530 分钟)配合长期 Refresh Token(如 714 天),并做好 Refresh Token 的轮转与作废机制。