使用Ruby的两个因素auth(通过设计)

时间:2016-03-04 10:36:48

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

我要在我的Ruby应用程序中添加两个因子身份验证。我需要使用简单的用例来实现它的简单实现:

  • 通过短信或电子邮件生成和发送代码的能力(意味着,我不希望将其附加到Google身份验证器上);

  • 首先显示登录密码表单的能力,然后是代码的表单(就像github现在一样)。

听起来不像是火箭科学。但不知怎的,我被卡住了。

所以我的问题是:是否有人试图实现这一点,如果是的话,你用什么策略来实现这个目标?

我已经尝试使用devise-two-factor宝石,它描述为" Barebones双因素身份验证与Devise"。

在引擎盖下,它使用登录名+密码+代码(所有同时)对用户进行身份验证。但在我的用例中,我希望用户首先输入登录+密码(使用表单发布),然后在用户输入代码之后将代码发送给用户,然后在下一个屏幕上输入代码。

我找到的唯一解决方案是在会话中存储登录名和密码(原文如此!),并在输入双因素代码后用于对用户进行身份验证。我对这个策略并不是很有信心。

3 个答案:

答案 0 :(得分:0)

设计 - 双因素是关于您的登录应如何工作的观点。我认为你最好直接使用ROTP gem(设计使用两个因素)并实现自定义解决方案。

答案 1 :(得分:0)

来自Twilio的Ricky。

我们建立了一个Two-Factor Authentication application in Ruby你可以查看你是否在寻找灵感。我们的应用程序使用的是Authy,代码中有几个相关的位用于启动它。

首先,当您创建新用户时,需要使用Authy注册它们以启用2FA:

    @user = User.new(user_params)
    if @user.save
      session[:user_id] = @user.id

      authy = Authy::API.register_user(
        email: @user.email,
        cellphone: @user.phone_number,
        country_code: @user.country_code
      )
      @user.update(authy_id: authy.id)

      redirect_to account_path
    else
      render :new
    end

然后,当用户尝试登录时,您可以使用Authy通过短信发送令牌,然后验证他们输入的令牌:

  def send_token
    @user = User.find(session[:pre_2fa_auth_user_id])
    Authy::API.request_sms(id: @user.authy_id)
    render plain: 'sending token'
  end

  def verify
    @user = User.find(session[:pre_2fa_auth_user_id])
    token = Authy::API.verify(id: @user.authy_id, token: params[:token])
    if token.ok?
      session[:user_id] = @user.id
      session[:pre_2fa_auth_user_id] = nil
      redirect_to account_path
    else
      flash.now[:danger] = "Incorrect code, please try again"
      redirect_to new_session_path
    end
  end

希望有所帮助!

答案 2 :(得分:0)

在这里回答自己感觉更好:毕竟我发现gitlab做这个2FA的方式最符合我的需求:https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/474

所以我使用了这段代码中的一些想法。

谢谢你们gitlab的帮助,你们给了我很多帮助!