Rails 401身份验证错误的自定义处理程序

时间:2013-12-24 04:52:32

标签: ruby-on-rails error-handling

我有一个API控制器,所有错误响应都以JSON的形式返回。

以下设置处理从操作引发的错误,但不处理在过滤器之前引发的身份验证错误 - 它会抛出一个导出为text / html的401。

  class ApiController < ActionController::Base

    rescue_from StandardError, with: :handle_errors
    before_filter :restrict_access

    def restrict_access
      authenticate_or_request_with_http_token do |token, options|
        false # Force authentication error
      end
    end

    def handle_errors(exception)
      render :json => { :errors => { :error => exception.message} }.to_json, :status => 400
    end

我需要做些什么来处理身份验证错误?

2 个答案:

答案 0 :(得分:3)

在@ Gjaldon的回答帮助我解决之后,我最终在我的API控制器中覆盖了request_http_token_authentication

def request_http_token_authentication(realm = "Application")  
  self.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}")
  self.__send__ :render, :json => { :error => "HTTP Token: Access denied. You did not provide an valid API key." }.to_json, :status => :unauthorized
end

答案 1 :(得分:2)

拒绝访问时会调用以下方法。

def Token.authentication_request(controller, realm)
  controller.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}")
  controller.__send__ :render, :text => "HTTP Token: Access denied.\n", :status => :unauthorized
end

您可以尝试覆盖它以更改行为,如:

def Token.authentication_request(controller, realm)
  controller.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}")
  controller.__send__ :render, :json => { :errors => { :error => exception.message} }.to_json, :status => 400
end