我有一个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
我需要做些什么来处理身份验证错误?
答案 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