我正试图在Devise上使用Gem设计双因素实现双因素身份验证。我希望身份验证分为两个步骤。首先,我要询问用户名和密码。如果用户通过了这一步骤,那么如果2FA被激活,他将被重定向到OTP的下一页,否则会话将由Devise验证。
如果用户选择了2FA,那么我想使用Devise进行所有身份验证,如果User.validate_and_consume_otp(CURRENT_otp(为true,则不想使用sign_in(user)
函数创建会话。我想把用户名密码和OTP作为参数传递给Devise,这样Devise就可以在没有我干预的情况下处理所有三个参数的身份验证。
为此,我想出了一些工作流程:-
-
如果用户名和密码有效且正确,我将把它们作为后参数传递,并把用户名和密码作为隐藏字段,以及用户在提交后填写的OTP,这三个参数将被发送到Devise进行验证。
-
我首先验证用户名,以及它是否存在于用户表中。如果存在,我将使用Devise默认函数user.Valid_Password检查有效密码?("YOUR_PASSWORD_COMES_HERE"(如果这两个条件都成立,我将把用户的电子邮件作为会话变量传递给下一步,在第二步中,我只验证正确的OTP(因为用户名和密码验证在步骤1中完成(如果OTP是正确的,否则我们将再次要求OTP。
你能提出更好的工作流程吗?
如果您想在两个步骤中获得2FA,可以尝试使用gemhttps://github.com/Houdini/two_factor_authentication.
这个gem的默认工作流程是:
- 插入用户名和密码
- 如果用户名和密码正确,则通知用户otp
- 插入otp
- 如果otp正确,则登录正确