与 Ruby 的双因素身份验证(通过设计)



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

  • 能够通过短信或电子邮件生成和发送代码(意味着,我不想与此附加到Google身份验证器);

  • 能够首先显示登录密码表单,然后显示代码表单(就像 GitHub 现在所做的那样)。

听起来还不像火箭科学。但不知何故,我被困住了。

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


我尝试使用devise-two-factor gem,它被描述为"使用 Devise 的准系统双因素身份验证"。

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

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

设计双因素对您的登录应该如何工作的看法。我认为您最好直接使用 ROTP gem(设计双因素使用)并实施自定义解决方案。

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

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

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

来自

Twilio的Ricky在这里。

我们在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

希望对您有所帮助!

相关内容

  • 没有找到相关文章

最新更新