微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django - 两步验证自定义登录

如何解决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 举报,一经查实,本站将立刻删除。