You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用django-fido实现无密码身份验证?

用django-fido实现无密码身份验证的实操方案

无密码身份验证核心依赖FIDO2的*可发现凭证(Resident Key,也叫常驻密钥)*特性,允许用户身份关联信息存储在安全密钥/生物识别模块中,无需提前输入用户名查询账户信息。django-fido默认未开启该特性,且强制单步验证需要用户名,按以下步骤修改即可实现需求:

配置调整

首先在项目settings.py中修改django-fido默认配置:

  • 开启可发现凭证支持:DJANGO_FIDO_RESIDENT_KEY = True,开启后用户注册安全密钥时会自动将身份关联信息存入密钥
  • 关闭用户名强制校验:DJANGO_FIDO_USERNAME_REQUIRED = False,允许认证流程不传入用户名参数

自定义认证后端

django-fido默认的认证后端需要先通过用户名查询用户,再做凭证校验,需要重写后端逻辑实现先从凭证中获取用户关联信息再校验:

from django_fido.auth.backends import Fido2AuthenticationBackend
from django.contrib.auth import get_user_model
from django_fido.models import Authenticator

User = get_user_model()

class PasswordlessFido2Backend(Fido2AuthenticationBackend):
    def authenticate(self, request, **kwargs):
        assertion = kwargs.get("assertion")
        if not assertion:
            return None
        # 从FIDO2验证返回的用户句柄匹配关联的用户凭证
        try:
            auth = Authenticator.objects.get(user_handle=assertion.user_handle)
        except Authenticator.DoesNotExist:
            return None
        # 复用原生校验逻辑验证凭证有效性
        if self.verify_assertion(request, assertion, user=auth.user):
            return auth.user
        return None

将自定义后端加入settings.py的认证后端列表:

AUTHENTICATION_BACKENDS = [
    # 替换为你自定义后端的实际路径
    "your_app.auth.backends.PasswordlessFido2Backend",
    # 原有认证后端可保留作为兼容 fallback
    "django.contrib.auth.backends.ModelBackend",
]

前端流程调整

  • 登录时直接调用django_fido:fido2_authentication_begin接口,不需要传入用户名参数,后端会返回支持可发现凭证的认证请求
  • 用户完成安全密钥/生物识别校验后,将返回的assertion结果提交到django_fido:fido2_authentication_complete接口即可完成登录,无需输入用户名和密码

注意事项:

  1. 仅支持开启可发现凭证后新注册的安全密钥,之前已注册的密钥需要重新绑定才能使用无密码登录
  2. 若要兼容不支持可发现凭证的旧安全密钥,可保留用户名输入框作为降级方案,不影响原有逻辑
  3. 如果要实现完全无密码体系,可在用户注册时调用user.set_unusable_password()禁用密码登录,避免绕开FIDO2验证的可能

内容的提问来源于stack exchange,提问作者James Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:36:03