ruby on rails - instalar - Custom Devise 401 respuesta no autorizada
devise wiki (2)
Como referencia, en caso de que alguien más se tope con esta pregunta cuando busque cómo personalizar la respuesta de error json cuando se realiza un intento fallido de inicio de sesión utilizando Devise, la clave es usar su propia implementación personalizada de FailureApp
. (También puede utilizar este enfoque para anular algunos comportamientos de redireccionamiento).
class CustomFailureApp < Devise::FailureApp
def respond
if request.format == :json
json_error_response
else
super
end
end
def json_error_response
self.status = 401
self.content_type = "application/json"
self.response_body = [ { message: i18n_message } ].to_json
end
end
y en su devise.rb
, busque la sección config.warden
:
config.warden do |manager|
manager.failure_app = CustomFailureApp
end
Algunos datos relacionados:
Al principio pensé que tendría que anular Devise::SessionsController , posiblemente utilizando la opción de recall
pasada a warden.authenticate!
, pero como se mencionó here , "la recuperación no se invoca para las solicitudes de API, solo para las de navegación. Si desea personalizar el código de estado http, tendrá más suerte al hacerlo en el nivel de la aplicación fallida".
También https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-not-be-authenticated muestra algo muy similar para la redirección .
Estoy trabajando en una API basada en JSON para mi aplicación Rails 3.1. Me gustaría proporcionar una respuesta de error personalizada en lugar del predeterminado, que es:
{"error":"You need to sign in or sign up before continuing."}
Mi controlador API incluye una llamada before_filter a authenticate_user!
, que es lo que está renderizando esta respuesta JSON.
Durante la búsqueda, encontré esta pregunta de StackOverflow , que hace referencia a esta entrada de la wiki de Devise . Desafortunadamente, la entrada de la wiki no es lo suficientemente detallada para que pueda entender lo que me dice. Específicamente, no tengo ni idea de dónde debo colocar ese código de manera que Devise / Warden sepa que debe devolver lo que quiero.
De los comentarios en la otra pregunta de SA, parece que no necesito llamar a custom_failure!
ya que estoy usando una versión de Devise por encima de 1.2 (1.4.2 para ser específico). Sin embargo, la entrada de la wiki no explica dónde debe ir la llamada de render
modo que authenticate_user!
Sabe usar eso en lugar de su propia llamada de render.
¿A dónde va esta llamada de render
?
Edición: no estoy tratando de cambiar el mensaje en sí (a la the devise en.yml
config); Estoy tratando de cambiar el formato real de la respuesta. Específicamente, quiero devolver esto:
render :text => "You must be logged in to do that.", :status => :unauthorized
Si simplemente desea cambiar el texto que se muestra con el mensaje de error, creo que solo puede editar el archivo de configuración regional (/config/locales/devise.en.yml).
El RailsCast sobre este tema también puede ser útil si desea detalles más específicos. Puede encontrarlo en http://railscasts.com/episodes/210-customizing-devise