Estaba trabajando en una nueva aplicación Rails 4 (en Ruby 2.0.0-p0) cuando me encontré con algunos problemas de token de autenticidad.
Mientras escribía un controlador que responde a json (usando el respond_to
método de clase), llegué a la create
acción y comencé a obtener ActionController::InvalidAuthenticityToken
excepciones cuando intenté crear un registro usando curl
.
Me aseguré de configurar -H "Content-Type: application/json"
y configurar los datos con, -d "<my data here>"
pero todavía no tuve suerte.
Intenté escribir el mismo controlador usando Rails 3.2 (en Ruby 1.9.3) y no tuve ningún problema con el token de autenticidad. Busqué y vi que había algunos cambios con los tokens de autenticidad en Rails 4. Por lo que entiendo, ¿ya no se insertan automáticamente en los formularios? Supongo que esto está afectando de alguna manera los tipos de contenido no HTML.
¿Hay alguna forma de evitar esto sin tener que solicitar un formulario HTML, arrebatando el token de autenticidad y luego haciendo otra solicitud con ese token? ¿O me estoy perdiendo por completo algo que es completamente obvio?
Editar: acabo de intentar crear un nuevo registro en una nueva aplicación Rails 4 usando un andamio sin cambiar nada y me encuentro con el mismo problema, así que supongo que no es algo que hice.
before_action
que verifique el formato y si la solicitud está verificada. No conozco ninguna forma integrada de establecer condiciones.skip_before_action :verify_authenticity_token
en el controlador de la aplicación de mi API para que esto funcione.:verify_authenticy_token
más en Rails 4.2. Su valor predeterminado es:null_session
, que, como su nombre lo indica, solo le da una solicitud sin una sesión. En su lugar, puede verificar la solicitud a través de una clave API.En lugar de desactivar la protección csrf, es mejor agregar la siguiente línea de código en el formulario
y si está usando form_for o form_tag para generar el formulario, entonces agregará automáticamente la línea de código anterior en el formulario
fuente
Agregar la siguiente línea en el formulario funcionó para mí:
fuente
=token_tag nil
o (en .erb)<%= token_tag nil %>
No creo que sea bueno desactivar generalmente la protección CSRF siempre que no implementes exclusivamente una API.
Al mirar la documentación de la API de Rails 4 para ActionController , descubrí que puede desactivar la protección contra falsificaciones en una base por controlador o por método.
Por ejemplo, para desactivar la protección CSRF para los métodos que puede usar
fuente
Encontré el mismo problema. Lo arreglé agregando a mi controlador:
fuente
¿Has probado?
fuente
Este documento oficial: habla sobre cómo desactivar la protección contra falsificaciones para la API correctamente http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
fuente
Esta es una característica de seguridad en Rails. Agregue esta línea de código en el formulario:
La documentación se puede encontrar aquí: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
fuente
Estas características se agregaron por motivos de seguridad y protección contra falsificaciones.
Sin embargo, para responder a su pregunta, aquí hay algunas entradas. Puede agregar estas líneas después del nombre del controlador.
Al igual que,
Aquí hay algunas líneas para diferentes versiones de rieles.
Carriles 3
Carriles 4 :
Si tiene la intención de deshabilitar esta característica de seguridad para todas las rutinas del controlador, puede cambiar el valor de protect_from_forgery a : null_session en su archivo application_controller.rb.
Al igual que,
fuente
Si está utilizando jQuery con rieles, tenga cuidado de permitir la entrada a métodos sin verificar el token de autenticidad.
jquery-ujs puede administrar los tokens por ti
Ya debería tenerlo como parte de la gema jquery-rails, pero es posible que deba incluirlo en application.js con
Eso es todo lo que necesita: su llamada ajax ahora debería funcionar
Para obtener más información, consulte: https://github.com/rails/jquery-ujs
fuente
Agregar
authenticity_token: true
a la etiqueta del formulariofuente
Cuando define su propio formulario html, debe incluir una cadena de token de autenticación, que debe enviarse al controlador por razones de seguridad. Si usa rails form helper para generar la autenticidad, el token se agrega al formulario de la siguiente manera.
Entonces, la solución al problema es agregar el campo authenticity_token o usar rails de ayudantes en lugar de comprometer la seguridad, etc.
fuente
application/json
.Todas mis pruebas estaban funcionando bien. Pero por alguna razón, configuré mi variable de entorno como no probada:
Olvidé desarmar esta variable por lo que comencé a obtener una
ActionController::InvalidAuthenticityToken
excepción.Después de desestabilizar
$RAILS_ENV
, mis pruebas comenzaron a funcionar nuevamente.fuente