在authy-devise中自定义视图

时间:2017-11-14 13:36:05

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

我正在尝试使用devise-authy gem通过authy 2FA of twilio实现双因素身份验证。

我想使用3个页面为2FA自定义视图。

  1. 第一页 - 我的登录页面,用户输入usernamepasswordon submit它将被重定向到页面

  2. 第二页 - 在此页面中,他可以选择 2FA方法以通过手机或短信接收代码,然后重定向

    < / LI>
  3. 第三页 - 他终于输入了代码。

  4. 我可以配置前两页。

    我的问题就是在第三页中,我设置了authy form进行代码验证,我收到错误 undefined method id for nil class

    <%= verify_authy_form do %>
      <legend><%= I18n.t('submit_token_title', {:scope => 'devise'}) %></legend>
      <%= label_tag :token %>
          <%= text_field_tag :token, "", :autocomplete => :off, :id => 'authy-token' %>
      <label>
      <%= check_box_tag :remember_device %>
          <span><%= I18n.t('remember_device', {:scope => 'devise'}) %></span>
      </label>
    
      <!-- Help tooltip -->
      <!-- You need to configure a help message. -->
      <!-- See documentation: https://github.com/authy/authy-form-helpers#help-tooltip -->
      <!-- <%= link_to '?', '#', :id => 'authy-help' %> -->
    
      <%= authy_request_sms_link %>
      <%= authy_request_phone_call_link %>
      <%= submit_tag I18n.t('submit_token', {:scope => 'devise'}), :class => 'btn' %>
    <% end %>
    

    我在此行verify_authy_form中收到错误 在检查gem的代码时我发现我需要@authy_id所以我试过了 <%@authy_id=User.find(session[:user_id]).authy_id%> 在视野中仍然没有成功。

    这是我的Users::AuthyCustomController,我已经覆盖了gem中所述的一些方法

    class Users::AuthyCustomController  < Devise::DeviseAuthyController
    
    protected
    def after_authy_enabled_path_for(resource)
      my_own_path
    end
    
    def after_authy_verified_path_for(resource)
      my_own_path
    end
    
    def after_authy_disabled_path_for(resource)
      my_own_path
    end
    
    def invalid_resource_path
      my_own_path
    end
    
    def authentication_sms    
    end
    
    def authentication_phone
      @authy_id=User.find(session[:user_id]).authy_id
      # redirect_to user_verify_authy_path
      # redirect_to user_verify_authy_path and return
    end
    end
    

    我用Google搜索,但我无法找到解决方案

1 个答案:

答案 0 :(得分:2)

  

我收到错误 undefined method id for nil class

这是form helper

def verify_authy_form(opts = {}, &block)
  opts = default_opts.merge(:id => 'devise_authy').merge(opts)
  form_tag([resource_name, :verify_authy], opts) do
    buffer = hidden_field_tag(:"#{resource_name}_id", @resource.id)
    buffer << capture(&block)
  end
end

我相信@resourcenil所以当它@resource.id触发错误

我相信此表单是通过此controller action

进行管理的
# verify 2fa
def POST_verify_authy
  token = Authy::API.verify({
    :id => @resource.authy_id,
    :token => params[:token],
    :force => true
  })

  if token.ok?
    @resource.update_attribute(:last_sign_in_with_authy, DateTime.now)

    session["#{resource_name}_authy_token_checked"] = true

    remember_device if params[:remember_device].to_i == 1
    if session.delete("#{resource_name}_remember_me") == true && @resource.respond_to?(:remember_me=)
      @resource.remember_me = true
    end
    sign_in(resource_name, @resource)

    set_flash_message(:notice, :signed_in) if is_navigational_format?
    respond_with resource, :location => after_sign_in_path_for(@resource)
  else
    handle_invalid_token :verify_authy, :invalid_token
  end
end

您可以通过检查并包含rake routes的相关输出来证明这一点。所以也许您应该调试这两段代码,控制器操作负责将@resource提供给form