使用Devise实现两因素身份验证

时间:2018-12-17 11:31:43

标签: ruby-on-rails ruby security devise two-factor-authentication

我正在尝试使用宝石Devisedevise-two-factor上实施两因素身份验证。我希望身份验证分两个步骤进行,首先我要询问用户名和密码。如果用户通过了此步骤,那么如果2FA被激活,他将被重定向到OTP的下一页,否则会话将由Devise进行验证。

如果用户选择了2FA,那么如果user.validate_and_consume_otp(CURRENT_OTP)为true,则我想使用Devise进行所有身份验证,并且不希望使用sign_in(user)函数创建会话。我想将用户名密码和OTP传递给Devise作为参数,以便Devise无需我的干预即可处理所有三个参数的身份验证。

为此,我提出了一些工作流程:-

  1. 如果用户名和密码有效且正确,我将把它们作为Post Params传递,并将用户名和密码与OTP一起作为隐藏字段以及用户将填写的OTP和提交后,这三个参数将发送给Devise进行验证。

  2. 我首先验证用户名是否在用户表中是否存在,如果存在,我将使用Devise默认函数user.valid_password?(“ YOUR_PASSWORD_COMES_HERE”)检查是否存在有效密码(如果这两个条件都为真)我将把用户的电子邮件作为会话变量传递到下一步,在第二步中,我仅验证是否正确进行了OTP(因为在步骤1中完成了用户名和密码验证),如果OTP是正确的,我们通过传递的电子邮件为用户创建会话作为会话变量,并在成功登录后删除会话,否则我们将再次要求输入OTP。

您能提出更好的工作流程吗?

1 个答案:

答案 0 :(得分:0)

如果要分两步获得2FA,可以尝试使用宝石https://github.com/Houdini/two_factor_authentication

此gem的默认工作流程是:

  1. 插入用户名和密码
  2. 如果用户名和密码正确,则将otp通知用户
  3. 插入otp
  4. 如果otp正确,则登录正确