1

我已经成功安装了 django_two_factor_auth:令牌登录、备份令牌和通过 Twilio 的 SMS 似乎都可以正常工作。不过,我的用户不会容忍每次登录都必须输入他们的令牌。

我的需求与以下讨论的类似: https ://github.com/Bouke/django-two-factor-auth/issues/56

我希望为用户提供在成功验证后将 OTP 验证推迟 30 天的选项。

为此,我安装了 django_agent_trust。如果安装了 django_agent_trust,我修补了 AuthenticationTokenForm 以添加 BooleanField:

(two_factor/forms.py,在 AuthenticationTokenForm 中)

try:
    from django_agent_trust import trust_agent
    trust_this_agent = forms.BooleanField(label=_("Trust this browser for 30 days"),
                                          required=False)
except:
    pass

我已经能够通过使用 django_agent_trust 的 django_agent_trust.trust_agent API 无条件地设置和重置 is_trusted 标志。

问题是找出在哪里捕获用户选择的 BooleanField 值。我在表单向导的某个地方迷路了。

如果我认为您的论点有道理,我会接受质疑我的整体方法是否明智的答案。我在这里缺少什么吗?

4

1 回答 1

2

在一开始的时候

django_agent_trust似乎是这个用例的一个很好的捷径。它已经有了安全的 cookie 支持,这是我以前从未使用过的 Django 的一个特性,以及我认为我需要的所有便利方法。

我能够通过一些额外的工作让它工作。

问题

我遇到的问题是django_agent_trust仅在用户通过身份验证后才验证签名的 cookie - 使用来自请求对象的经过身份验证的用户。由于我试图最小化对django_two_factor_auth的更改,因此我需要在身份验证发生之前决定是否显示 OTP 表单。

解决方案

我需要的所有工具都在django_agent_trust中。我将我需要的方法从它的中间件中提取到一个新的 utils.py 中,在load_agent()中添加了一个 'user' 参数。然后,我能够根据django_two_factor_authLoginView类中已验证但尚未登录的用户对象检查 cookie 。

现在django_two_factor_authLoginView可以在has_token_stephas_backup_step中测试代理信任,并且一切都或多或少地像作者在 11 个月前预测的那样......叹息。

我认为添加这个信任元素作为对django_two_factor_auth的增强可能是有意义的。对所有这些组件进行杂耍似乎是错误的做法。

之后

我从django_otp项目中得到启发,并将agent_trust作为“插件”添加到two_factor。以这种形式看起来很有用,而且可能更容易消化。这对我有用,但我怀疑有更好的方法来做到这一点。欢迎补丁。

于 2015-04-25T18:45:30.460 回答