使用Django表单向导为登录页面实现安全的双因素身份验证

时间:2011-02-23 20:49:41

标签: django authentication django-formwizard

所以基本上我想要实现与Google双因素身份验证实现类似的功能。我的登录表单包含两步表单向导:

  1. 第1步(验证用户名和密码)
  2. 第2步(验证安全令牌)
  3. 使用场景将是:

    1. 用户拥有与其帐户关联的安全令牌:如果用户通过了步骤1和步骤2
    2. ,则将用户登录
    3. 用户没有安全令牌:仅在通过步骤1后立即记录用户
    4. 我现在正在继续使用django的表单向导作为我的登录视图。在第2步中,默认情况下,Django FormWizard会将以前提交的表单中的字段值包含为隐藏字段。但是如您所知,密码是在步骤1中输入的,因此出于安全原因,我不希望将其包含在步骤2中。

      我的第一个想法是使用会话来指示用户是否已通过步骤1,因此我不需要包含步骤1中的字段值..但我可能会忽略这里的某些内容。对此有哪些更安全的解决方案?

      另外,我不太明白在FormWizard中使用security-hash。有人可以解释一下吗?

      非常感谢。

5 个答案:

答案 0 :(得分:5)

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

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

与您的描述的不同之处在于,我们不会在单个表单中对两者进行身份验证,也不会在表单之间传递凭据,我们会单独执行。只需使用两个装饰器保护视图,您就可以依赖Django在尝试第二个因子身份验证之前断言本地身份验证。

答案 1 :(得分:5)

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

Django-two-factor-auth以django-otp为基础,并添加了对Google身份验证器,Twilio SMS,备用代码的开箱即用支持。非常令人印象深刻。

答案 2 :(得分:3)

我并没有完全明白安全令牌,但如果您放弃FormWizard并将其作为两个单独的视图实现,它看起来会更简单,更快捷。 FormWizard的重点是打破并将多个表单合并为一个,并且您的特定用例与之相反 - 您只是将其破解为功能性地执行其他操作。

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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