【问题标题】:Two factor auth with Ruby (through devise)使用 Ruby 进行两因素身份验证(通过设计)
【发布时间】:2016-06-18 01:23:32
【问题描述】:

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

  • 能够通过短信或电子邮件生成和发送代码(意思是,我不想将其附加到 Google Authenticator);

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

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

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


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

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

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

【问题讨论】:

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


    【解决方案1】:

    devise-two-factor 对您的登录方式应该如何工作有意见。我认为您最好直接使用 ROTP gem(设计两个因素使用)并实施自定义解决方案。

    【讨论】:

      【解决方案2】:

      来自 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 通过 SMS 发送令牌,然后验证他们输入的令牌:

        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
      

      希望有帮助!

      【讨论】:

      • 感谢 Twilio 的 Ricky!这看起来真的很有用,因为我不想从头开始构建所有东西(在这里做错事似乎有点危险)。实际上我使用了 Gitlab 的大部分代码,因为他们面临相同的任务并成功解决。
      【解决方案3】:

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

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

      感谢 gitlab 的各位,你们帮了我很多!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 2019-07-21
        • 2016-09-09
        • 2015-12-08
        • 1970-01-01
        相关资源
        最近更新 更多