【问题标题】:How to authenticate otp entered by user from browser in database?如何在数据库中验证用户从浏览器输入的 otp?
【发布时间】:2019-03-27 09:56:28
【问题描述】:

我正在开发 OTP 登录轨道应用程序。我使用活动模型 otp gem 来生成 otp。gem 创建 otp_secret_key 列来存储 otp。应用程序通过邮件将 OTP 发送给用户。然后用户应输入电子邮件并更正 otp 以登录(应创建会话)。我被困在创建会话的部分。会话代码如下:

定义创建 user = User.find_by(email: params[:session][:email]) otp = 参数[:session][:otp_code] 如果 user.authenticate_otp(otp) session[:user_id] = user.id flash[:success] = '登录成功' 重定向到 Welcome_home_path 别的 flash.now[:danger] = '您的登录信息有问题!' 结尾 结尾

提交表单后params hash中的参数有:

参数:{"utf8"=>"✓", "session"=>{"email"=>"test23@example.com", "otp_code"=>"8496"}, "commit"=>"Login"}

但是在浏览器上它卡在同一页面上,在终端上它显示 No template found for SessionsController#create, rendering head :no_content 但如果输入的值正确,我想将其重定向到欢迎/主页路径。

怎么做?

P.S:我有 user_id、user_email 和 otp_secret_key 列的用户表 提前致谢

【问题讨论】:

  • 你在 SessionsController 中有这个 create 方法吗?还要检查你是否在 routes.rb 中添加了所有路由
  • 是的,这是在会话控制器中,并且此方法中提到的所有路由都有效。如果我只是将代码编写为 `user = User.find_by(email: params[:session][:email ]) 如果 user.present? redirect_towelcome_home_path' 它会转到该路径。我无法从浏览器中获取 otp 并从数据库中检查它
  • 您的代码对我来说看起来不错。你检查过 params[:session][:otp_code] 返回什么吗?
  • 我尝试像这样打印它 'puts params[:session][:otp_code]' 来检查它返回的内容,它会抛出 can't covert symbol to integer 的错误
  • 所以现在你现在问题出在哪里。这可能是因为您使用的是 :otp_code 但在您的参数中它的“otp_code”。我不确定这是否是确切的问题。通过此链接阅读更多相关信息api.rubyonrails.org/classes/ActiveSupport/…

标签: ruby-on-rails session


【解决方案1】:

事实证明,在活动 otp gem 中,特定用户的 otp 仅在 30 秒内有效。因此,如果我立即对用户进行身份验证,它就可以工作。但是 30 秒后它显示为“无效的登录信息”。 所以我用drift:来增加otp的有效期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多