如何解决Django - 两步验证自定义登录
在快速搜索和阅读文档后,我在我的一个 Django 项目 [Reference Link] 中实现了 Django - 双重身份验证。
效果很好,我使用 Google Authenticator 进行基于令牌的登录。当我想扩展库的登录方法时会出现问题。我想强制我的每个用户使用 2-Factor-Auth 作为强制。我没有使用任何注册措施,因此必须在用户登录时进行检查。
PS:我有一个自定义用户模型,目前我使用的是 Django 双重身份验证附带的默认登录。
我不认为代码是必需的,所以我没有发布它,但如果需要我可以分享它。
解决方法
在彻底查看库代码后,我能够操作 two_factor 库中的检查。
因此,查看 two_factor
文件夹很容易理解,它只不过是一个与其他应用程序类似的 Django 应用程序。
我导航到虚拟环境 venv\Lib\site-packages\two_factor\views\core.py
中的库文件。正如文档中提到的,到目前为止,还没有强制用户设置 2fa。
在 LoginView(...)
中有一个函数 done
。 IT 检查 2fa 的设备可用性,只需添加用于重定向的 else 子句即可。
def done(self,form_list,**kwargs):
"""
Login the user and redirect to the desired page.
"""
# Check if remember cookie should be set after login
current_step_data = self.storage.get_step_data(self.steps.current)
remember = bool(current_step_data and current_step_data.get('token-remember') == 'on')
login(self.request,self.get_user())
redirect_to = self.get_success_url()
device = getattr(self.get_user(),'otp_device',None)
response = redirect(redirect_to)
if device:
signals.user_verified.send(sender=__name__,request=self.request,user=self.get_user(),device=device)
# Set a remember cookie if activated
if getattr(settings,'TWO_FACTOR_REMEMBER_COOKIE_AGE',None) and remember:
# choose a unique cookie key to remember devices for multiple users in the same browser
cookie_key = REMEMBER_COOKIE_PREFIX + str(uuid4())
cookie_value = get_remember_device_cookie(user=self.get_user(),otp_device_id=device.persistent_id)
response.set_cookie(cookie_key,cookie_value,max_age=settings.TWO_FACTOR_REMEMBER_COOKIE_AGE,domain=getattr(settings,'TWO_FACTOR_REMEMBER_COOKIE_DOMAIN',None),path=getattr(settings,'TWO_FACTOR_REMEMBER_COOKIE_PATH','/'),secure=getattr(settings,'TWO_FACTOR_REMEMBER_COOKIE_SECURE',False),httponly=getattr(settings,'TWO_FACTOR_REMEMBER_COOKIE_HTTPONLY',True),samesite=getattr(settings,'TWO_FACTOR_REMEMBER_COOKIE_SAMESITE','Lax'),)
else:
return redirect('two_factor:setup')
return response
因此,只有当用户设置了 2fa 时,设备检查才能成功,但对于未经验证的用户,它永远不会成功。
我完全理解会有一种更高效、更优雅的方法来完成上述任务,但由于我的知识和时间有限,我必须这样做。如果遇到我会发布更新,也欢迎对我的解决方案提供反馈。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。