【问题标题】:Django 2FA works locally but fails (silently) on serverDjango 2FA 在本地工作,但在服务器上(静默)失败
【发布时间】:2021-07-06 16:56:12
【问题描述】:

问题

我需要为 Django 项目实施双重身份验证。我正在使用Django Two-Factor Authentication,它在本地使用 Google Authenticator 和我们的 SMS 网关都可以正常工作。当我将应用程序发布到测试服务器时会出现此问题。登录正常工作,但是当我填写令牌时,它只会将我重定向回初始登录步骤以再次填写我的凭据。它没有在 UI 中给我任何错误消息,据我所知,日志中也没有。

不知道是否相关,但该应用在服务器上作为 Docker Swarm 服务运行。

我尝试过的

由于缺乏对 2FA 库和 OTP 库的反馈和知识,我真的不知道从哪里开始。我很确定我的本地机器和测试环境之间的设置一样好。软件包版本相同。我什至确保我的机器和服务器之间的时间和时区是相同的。

在 OTP 库表中的数据库中查找失败计数为 0,并且每次我尝试登录时last_t 都会增加。这告诉我,令牌本身已被验证,根据 Django-OTP 文档:

BigIntegerField:最后验证令牌的时间步长。避免 两次验证相同的令牌,这将在每次更新 验证成功。只有更高时间步的令牌才会 随后得到验证。 (默认值:-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

这基本上是我添加的所有内容,以便使其在我的机器上本地工作。

【问题讨论】:

  • 请发布您的代码并记录输出

标签: django django-two-factor-auth


【解决方案1】:

在我的更新中发现日志行给了我一些东西给谷歌,我发现了这个:https://github.com/Bouke/django-two-factor-auth/issues/65#issuecomment-57931565

所以发生的情况是浏览器要求我的登录豁免 url 中没有列出的 favicon.ico,因此请求被重定向到登录页面,这使实际屏幕上的初始登录无效。

不知道为什么这没有在本地发生,但可能与开发服务器有关...无论如何它现在正在工作!

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多