通过查看库代码后,我能够操作 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 的情况下,设备检查才能成功,但对于未经验证的用户永远不会成功。
我完全理解将有一种更有效、更优雅的方法来完成上述任务,但由于我的知识和时间限制,我必须这样做。如果我遇到,我会发布更新,我也欢迎为我的解决方案提供反馈。