Django 2FA 在本地工作但在服务器上(静默地)失败
Django 2FA works locally but fails (silently) on server
问题
我需要为 Django 项目实施双因素身份验证。我正在使用 Django Two-Factor Authentication,它在本地与 Google Authenticator 和我们的 SMS 网关一起工作得很好。当我将应用程序发布到测试服务器时出现问题。登录工作正常,但当我填写令牌时,它只会将我重定向回初始登录步骤以再次填写我的凭据。它没有在 UI 中给我任何错误消息,据我所知,在日志中也没有给我 none。
不知道它是否相关,但该应用程序 运行 作为服务器上的 Docker Swarm 服务。
我试过的
由于缺乏对 2FA 库和 OTP 库的反馈和知识,我真的不知道从哪里开始。我很确定我的本地机器和测试环境之间的设置一样好。包版本是一样的。我什至确保我的机器和服务器之间的时间和时区相同。
在 OTP 库的表中查看数据库,失败计数为 0,每次我尝试登录时 last_t
都在递增。这告诉我令牌本身已经过验证,根据Django-OTP 文档:
BigIntegerField: The time step of the last verified token. To avoid
verifying the same token twice, this will be updated on each
successful verification. Only tokens at a higher time step will be
verified subsequently. (Default: -1)
非常感谢任何建议。我知道我没有提供具体实施的具体细节,但我希望有人可能对问题可能有一些大概的了解。无论如何,如果您需要更具体的内容,请告诉我。
谢谢,
妮可
编辑 1
我错了,日志里居然有我之前没看到的东西:
Requested step 'token' is no longer valid, returning to last valid step in the wizard.
所以这可能表明我有一些偏差导致令牌无效?
版本是
- 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:
ISTALLED_APPS = [
...
'django_otp',
'django_otp.plugins.otp_static',
'django_otp.plugins.otp_totp',
'two_factor'
]
MIDDLEWARE = [
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django_otp.middleware.OTPMiddleware',
...
]
LOGIN_URL = 'two_factor:login'
# Not sure if these are relevant
TIME_ZONE = 'Europe/Oslo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
这基本上是我添加的所有内容,以使其在我的机器上本地运行。
在我的更新中发现日志行给了我一些东西 google 我发现了这个:https://github.com/Bouke/django-two-factor-auth/issues/65#issuecomment-57931565
所以发生的事情是浏览器要求 favicon.ico 未在我的登录豁免 url 中列出,因此请求被重定向到登录页面,这使实际屏幕上的初始登录无效。
不知道为什么本地没有发生这种情况,但可能与开发服务器有关...无论如何它现在正在工作!
问题
我需要为 Django 项目实施双因素身份验证。我正在使用 Django Two-Factor Authentication,它在本地与 Google Authenticator 和我们的 SMS 网关一起工作得很好。当我将应用程序发布到测试服务器时出现问题。登录工作正常,但当我填写令牌时,它只会将我重定向回初始登录步骤以再次填写我的凭据。它没有在 UI 中给我任何错误消息,据我所知,在日志中也没有给我 none。
不知道它是否相关,但该应用程序 运行 作为服务器上的 Docker Swarm 服务。
我试过的
由于缺乏对 2FA 库和 OTP 库的反馈和知识,我真的不知道从哪里开始。我很确定我的本地机器和测试环境之间的设置一样好。包版本是一样的。我什至确保我的机器和服务器之间的时间和时区相同。
在 OTP 库的表中查看数据库,失败计数为 0,每次我尝试登录时 last_t
都在递增。这告诉我令牌本身已经过验证,根据Django-OTP 文档:
BigIntegerField: The time step of the last verified token. To avoid verifying the same token twice, this will be updated on each successful verification. Only tokens at a higher time step will be verified subsequently. (Default: -1)
非常感谢任何建议。我知道我没有提供具体实施的具体细节,但我希望有人可能对问题可能有一些大概的了解。无论如何,如果您需要更具体的内容,请告诉我。
谢谢,
妮可
编辑 1
我错了,日志里居然有我之前没看到的东西:
Requested step 'token' is no longer valid, returning to last valid step in the wizard.
所以这可能表明我有一些偏差导致令牌无效?
版本是
- 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:
ISTALLED_APPS = [
...
'django_otp',
'django_otp.plugins.otp_static',
'django_otp.plugins.otp_totp',
'two_factor'
]
MIDDLEWARE = [
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django_otp.middleware.OTPMiddleware',
...
]
LOGIN_URL = 'two_factor:login'
# Not sure if these are relevant
TIME_ZONE = 'Europe/Oslo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
这基本上是我添加的所有内容,以使其在我的机器上本地运行。
在我的更新中发现日志行给了我一些东西 google 我发现了这个:https://github.com/Bouke/django-two-factor-auth/issues/65#issuecomment-57931565
所以发生的事情是浏览器要求 favicon.ico 未在我的登录豁免 url 中列出,因此请求被重定向到登录页面,这使实际屏幕上的初始登录无效。
不知道为什么本地没有发生这种情况,但可能与开发服务器有关...无论如何它现在正在工作!