我正在尝试在现有的rails 4.2.10
应用程序中实施 2FA(双因素身份验证),我已经配置了很多位。
我面临的问题是获取/检索对5 minutes
有效的代码,并将此代码发送给定义为phone number
或email
的用户。
我确实尝试了 ROTP :: TOTP.new(user.otp_secret).at(Time.now),猜测来自gem的源代码,这似乎工作正常并在控制台中提供有效的otp_code ,但在sessions_controler
中,听起来很奇怪,user.otp_secret
为空,总是......
我不认为这可能是错误,而是我想要构建的功能。
我的筹码:
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中的一个错误。我还不确定。
答案 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 ...