ruby on rails - authenticate_or_request_with_http_token que devuelve html en lugar de json
ruby-on-rails rails-api (1)
He creado una aplicación rails-api y procedí a protegerla mediante la autenticación de token.
He establecido un before_filter
que llama a un método que utiliza authenticate_or_request_with_http_token
. Todo funciona bien pero, cuando la autenticación es incorrecta, obtengo una respuesta html.
¿Cómo puedo definir qué formato debe tener la respuesta?
before_filter :restrict_access
private
def restrict_access
authenticate_or_request_with_http_token do |token, options|
check_token token
end
end
def check_token(token)
Session.exists?(access_token: token)
end
Al incluir ActionController::HttpAuthentication::Token::ControllerMethods
, incluye varios métodos, entre otros, request_http_token_authentication
que es simplemente una envoltura alrededor de Token.authentication_request
. Ese método #authentication_request
es el culpable y envía el texto sin formato (no HTML como sugiere su pregunta) de la siguiente manera:
def authentication_request(controller, realm)
controller.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}")
controller.__send__ :render, :text => "HTTP Token: Access denied./n", :status => :unauthorized
end
El truco consiste en anular request_http_token_authentication
en su ApplicationController
para no llamar a Token.authentication_request
sino para establecer el estado y los encabezados correctos y luego procesar JSON en su lugar. Agregue esto a su ApplicationController
:
protected
def request_http_token_authentication(realm = "Application")
self.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}")
render :json => {:error => "HTTP Token: Access denied."}, :status => :unauthorized
end