设计双因素如何使代码有效通过短信/电子邮件等发送自定义时间

时间:2017-10-30 13:17:32

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

我正在尝试在现有的rails 4.2.10应用程序中实施 2FA(双因素身份验证),我已经配置了很多位。

我面临的问题是获取/检索对5 minutes有效的代码,并将此代码发送给定义为phone numberemail的用户。

我确实尝试了 ROTP :: TOTP.new(user.otp_secret).at(Time.now),猜测来自gem的源代码,这似乎工作正常并在控制台中提供有效的otp_code ,但在sessions_controler中,听起来很奇怪,user.otp_secret为空,总是......

我已发布an issue on the gem.

我不认为这可能是错误,而是我想要构建的功能。

我的筹码:
Ruby:2.4.2
导轨:4.2.10
设计:4
attr_encrypted:1.4(如果重要的话)

此外,我想将漂移期(代码接受时间)延长到5分钟。我认为这很容易,但是对于单个代码而不是普遍代码,或者对所有代码来说,这让我想了一会儿。
我的主要问题是第一个,让代码通过短信发送,这是一个子问题,我认为这是可行的,但如果有人有/经验,可以提供帮助,那就太棒了。

更新:我更新了attr_encrypted并重新启动了系统,它开始工作,我也意识到有一个方法current_otp,其中devise_two_factor添加了用户模型,所以我开始使用它。几分钟之后,它也是同样的问题,即user.otp_secret是nil。它变得很奇怪......

UPDATE 2 / Hacky解决方案:奇怪的是,我不得不在用户模型中添加这三种方法,一切都开始了:

  def encrypted_otp_secret
    self[:encrypted_otp_secret]
  end

  def encrypted_otp_secret_iv
    self[:encrypted_otp_secret_iv]
  end

  def encrypted_otp_secret_salt
    self[:encrypted_otp_secret_salt]
  end

正如你可以怀疑的那样,我通过检查user.encrypted_otp_secret即使在重新加载用户模型之后没有给我零的行为来到这里。做user[:encrypted_otp_secret]给了我实际的价值。

这似乎是attr_encrypted中的一个错误。我还不确定。

1 个答案:

答案 0 :(得分:0)

对于遇到此问题的其他任何人,我已经找到了使current_otp方法正常工作所需的下一步。在方法pre_otp方法调用

   > u = User.find_by(email: 'test@example.com')
   > u.otp_required_for_login = true
   > u.otp_secret = User.generate_otp_secret
   > u.save!

然后您可以调用u.current_otp ...

https://blog.tommyku.com/blog/integrating-two-step-two-factor-authentication-into-rails-4-project-with-devise/