8

所以基本上我想实现类似于谷歌双因素身份验证实现的东西。我的登录表单包含一个两步表单向导:

  1. 第 1 步(验证用户名和密码)
  2. 第 2 步(验证安全令牌)

使用场景将是:

  1. 用户有一个与其帐户关联的安全令牌:如果用户通过了第 1 步和第 2 步,则登录用户
  2. 用户没有安全令牌:仅在用户通过第 1 步后立即登录

我现在将 django 的表单向导子类化为我的登录视图。在第 2 步中,默认情况下 Django FormWizard 将包含来自先前提交的表单的字段值作为隐藏字段。但如您所知,密码是在步骤 1 中输入的,因此出于安全原因,我不想将其包含在步骤 2 中。

我的第一个想法是使用 session 来指示用户是否已通过第 1 步,因此我不需要包含第 1 步中的字段值。但我可能在这里忽略了一些东西。对此有什么更安全的解决方案?

此外,我不太了解 FormWizard 中安全哈希的使用。有人可以解释吗?

非常感谢。

4

5 回答 5

5

Duo Security 的 duo_web项目有一个开源 Django 演示,它将向您展示一种方法(我是 Duo 开发人员)。

演示设置有一个类似于内置 @login_required 的 @duo_auth_requried 装饰器,它检查指示用户已通过第二因素身份验证的会话 cookie。@login_required 装饰器验证本地身份验证,@duo_auth_required 装饰器验证第二因素身份验证,缺少任何一个都将用户重定向到相关表单。

与您的描述不同的是,我们不会在单个表单中进行身份验证,也不会在表单之间传递凭据,而是分别进行。只需使用两个装饰器保护一个视图,您就可以依靠 Django 在尝试第二个因素身份验证之前断言本地身份验证。

于 2011-04-23T00:00:36.277 回答
5

一年多后的最后一个答案:

Django-two-factor-auth基于 django-otp 构建,并添加了对 Google Authenticator、Twilio SMS、备份代码的开箱即用支持。非常令人印象深刻。

于 2014-07-17T09:01:17.157 回答
3

我并没有完全理解安全令牌的意义,但是如果您放弃扩展FormWizard并仅将其实现为两个单独的视图,它似乎会更简单、更快。的全部意义在于将FormWizard几种形式分解并聚合为一个形式,而您的特定用例与它相悖——您只是在破解它以在功能上做一些其他事情。

至于安全哈希,它为成功完成的步骤中的所有表单数据计算哈希。这只是一种安全措施,以确保表单数据在步骤之间没有更改/被篡改,并且没有任何步骤被以某种方式绕过。

于 2011-02-24T09:25:07.107 回答
2

django-otp项目向Django 添加了可插入的两因素身份验证。它可以集成在各个级别,从视图到表单再到低级 API。

于 2013-03-11T01:19:41.877 回答
0

您可以使用现有的多因素身份验证后端,例如 LinOTP 或privacyidea。我创建了一个django-plugin文章。

于 2014-07-18T19:11:13.323 回答