如何使用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接口即可完成登录,无需输入用户名和密码
注意事项:
- 仅支持开启可发现凭证后新注册的安全密钥,之前已注册的密钥需要重新绑定才能使用无密码登录
- 若要兼容不支持可发现凭证的旧安全密钥,可保留用户名输入框作为降级方案,不影响原有逻辑
- 如果要实现完全无密码体系,可在用户注册时调用
user.set_unusable_password()禁用密码登录,避免绕开FIDO2验证的可能
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

