截至我的知识库(2025年5月),Django 内置的用户认证系统(django.contrib.auth)本身并不直接支持多因素认证(MFA),TOTP(基于时间的一次性密码)、短信验证码或邮箱验证码等。

Django 的认证系统设计得相当灵活,可以通过以下方式集成 MFA:
-
官方支持的插件(推荐):
django-otpdjango-otp是 Django 社区中最流行、最稳定的 MFA 支持库,它不是一个独立的认证后端,而是与 Django 的auth系统深度集成。- 它支持 TOTP(Google Authenticator、Authy 等)、HOTP(基于计数器的一次性密码)、静态备份码、YubiKey(通过 U2F/WebAuthn)等。
- 通常与
django-allauth或django-two-factor-auth(基于 django-otp 构建的更高层封装)一起使用,以实现完整的用户注册、登录和 MFA 流程。 django-two-factor-auth:这是基于django-otp的直接推荐方案,提供了开箱即用的登录视图、设置视图和备份令牌管理。
-
使用第三方认证后端(SaaS/API 服务)
- 如果你希望完全由云服务处理 MFA(如 Google、GitHub、Microsoft、Auth0、Firebase),可以使用
django-allauth(支持社交登录)或django-rest-framework+djoser(配合 JWT + 外部令牌服务)。 - 这些服务通常自带 MFA 配置选项(如 Google Authenticator、短信验证码、生物识别),Django 只需接收并信任其返回的认证令牌。
- 如果你希望完全由云服务处理 MFA(如 Google、GitHub、Microsoft、Auth0、Firebase),可以使用
-
自行扩展 Django 认证系统
- 如果你需要非常定制化的流程(例如自定义的硬件 Token 验证、WebAuthn 无密码认证),可以编写自定义的
AuthenticationBackend或中间件,结合django.contrib.auth的login()函数进行二次验证。 - 用户在第一步通过密码登录后,会话被标记为“未完成 MFA”,然后在第二个视图(如输入 TOTP 码)中完成验证后,才完全认证。
- 如果你需要非常定制化的流程(例如自定义的硬件 Token 验证、WebAuthn 无密码认证),可以编写自定义的
总结建议(截至2025年5月):
- 快速实现、开箱即用:使用
django-two-factor-auth(基于django-otp),它几乎不需要修改现有用户模型,提供了完整的 MFA 设置和验证 UI。 - 需要社交登录 + MFA:使用
django-allauth+django-otp,或直接依赖外部认证提供商(如 Auth0、Firebase)处理 MFA。 - 需要 WebAuthn / 无密码:考虑
django-otp结合第三方 WebAuthn 库(如webauthn或py_webauthn),或使用专门的 SaaS 服务。
为什么不内置? Django 的核心设计哲学是保持认证系统轻量、通用,避免强制所有项目引入复杂的 MFA 流程,MFA 验证的配置、UI、设备管理等更适合作为可选的扩展组件。
虽然 Django 本身不直接支持 MFA,但通过成熟、稳定的社区包(特别是 django-otp 和 django-two-factor-auth),你可以非常轻松地为任何 Django 项目添加 MFA 支持。