ruby-on-rails json rails-api

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