问题描述
问题
我需要为 Django 项目实现两因素身份验证。我正在使用 Django Two-Factor Authentication,它在本地使用 Google 身份验证器和我们的 SMS 网关都可以正常工作。当我将应用程序发布到测试服务器时会出现此问题。登录正常工作,但是当我填写令牌时,它只会将我重定向回初始登录步骤以再次填写我的凭据。它没有在 UI 中给我任何错误消息,据我所知,日志中也没有。
不知道是否相关,但该应用在服务器上作为 Docker Swarm 服务运行。
我尝试了什么
由于缺乏对 2FA 库以及 OTP 库的反馈和知识,我真的不知道从哪里开始。我很确定我的本地机器和测试环境之间的设置一样好。软件包版本相同。我什至确保我的机器和服务器之间的时间和时区是相同的。
查看 OTP 库表中的数据库,失败计数为 0,每次尝试登录时 > mydata
# A tibble: 6 x 5
# Groups: Region [3]
date Region Number `Total Population` `Ratio of Total`
<dbl> <chr> <dbl> <dbl> <chr>
1 2020 Sicilia 20 50 40.0%
2 2021 Sicilia 30 50 60.0%
3 2020 Sardegna 50 120 41.7%
4 2021 Sardegna 70 120 58.3%
5 2020 Campania 90 159 56.6%
6 2021 Campania 69 159 43.4%
都会递增。这告诉我令牌本身已验证,根据 Django- OTP 文档:
BigIntegerField:最后验证令牌的时间步长。避免 两次验证相同的令牌,这将在每次更新 验证成功。只有在更高时间步长的令牌才会被 随后核实。 (默认:-1)
非常感谢任何建议。我知道我没有提供我的确切实现的太多具体细节,但我希望有人可能对问题可能有一些大致的了解。无论如何,如果您需要更具体的东西,请告诉我。
谢谢,
尼克诺
编辑 1
我错了,实际上日志中有一些我以前没有看到的内容:
last_t
所以也许这可以表明我有一些漂移导致令牌无效?
版本是
- Django 2.2.20
- django-otp 1.0.3
- django-two-factor-auth 1.13.1
我会尝试包含相关代码
我的settings.py分为环境设置,每个settings.base.py。 2FA 的所有相关代码都在 settings.base.py 中:
Requested step 'token' is no longer valid,returning to last valid step in the wizard.
这基本上就是我为了让它在我的机器上本地工作而添加的所有内容。
解决方法
在我的更新中发现的日志行给了我一些东西给谷歌,我发现了这个:https://github.com/Bouke/django-two-factor-auth/issues/65#issuecomment-57931565
所以发生的情况是浏览器要求 favicon.ico 没有在我的登录豁免 URL 中列出,因此请求被重定向到登录页面,这使实际屏幕上的初始登录无效。
不知道为什么这没有发生在本地,但可能是开发服务器的问题......无论如何它现在可以工作了!