Estoy enviando datos desde la vista al controlador con AJAX y recibí este error:
ADVERTENCIA: no se puede verificar la autenticidad del token CSRF
Creo que tengo que enviar este token con datos.
¿Alguien sabe cómo puedo hacer esto?
Editar: mi solución
Hice esto poniendo el siguiente código dentro de la publicación de AJAX:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
ruby-on-rails
jquery
csrf
kbaccouche
fuente
fuente
Respuestas:
Usted debe hacer esto:
Asegúrese de tener
<%= csrf_meta_tag %>
en su diseñoAgregue
beforeSend
a toda la solicitud ajax para establecer el encabezado como se muestra a continuación:Para enviar token en todas las solicitudes que puede usar:
fuente
La mejor manera de hacerlo es usarlo
<%= form_authenticity_token.to_s %>
para imprimir el token directamente en su código de rieles. No necesita usar javascript para buscar el dom para el token csrf como mencionan otras publicaciones. simplemente agregue la opción de encabezados como se muestra a continuación;fuente
Si no recuerdo mal, debe agregar el siguiente código a su formulario para deshacerse de este problema:
No olvides el parámetro.
fuente
<%= token_tag(nil) %>
. Luego obtienes el token generado automáticamente.De hecho, la forma más simple. No te molestes en cambiar los encabezados.
Asegúrate de tener:
Simplemente haga un campo de entrada oculto así:
O si quieres una publicación de jQuery ajax:
fuente
La actualización de una aplicación anterior a Rails 3.1, incluida la metaetiqueta csrf, todavía no la resuelve. En el blog de rubyonrails.org, dan algunos consejos de actualización, y específicamente esta línea de jquery que debe ir en la sección principal de su diseño:
tomado de esta publicación de blog: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .
En mi caso, la sesión se reiniciaba con cada solicitud de ajax. Agregar el código anterior resolvió ese problema.
fuente
<%= csrf_meta_tag %>
en su diseñobeforeSend
para incluir el token csrf en la solicitud ajax para establecer el encabezado. Esto solo es necesario para laspost
solicitudes.El código para leer el csrf-token está disponible en
rails/jquery-ujs
, por lo tanto, es más fácil usarlo de la siguiente manera:fuente
headers: { 'X-CSRF-Token': Rails.csrfToken() }
Solo pensé en vincular esto aquí ya que el artículo tiene la mayor parte de la respuesta que estás buscando y también es muy interesante
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/
fuente
Las respuestas más votadas aquí son correctas, pero no funcionarán si realiza solicitudes entre dominios porque la sesión no estará disponible a menos que explícitamente le diga a jQuery que pase la cookie de la sesión. Aquí se explica cómo hacerlo:
fuente
Puedes escribirlo globalmente como a continuación.
JS normal:
Guión de café:
fuente
oops ..
Perdí la siguiente línea en mi application.js
Lo reemplacé y está funcionando ...
======= ACTUALIZADO =========
Después de 5 años, he vuelto con el mismo error, ahora tengo un nuevo Rails 5.1.6 y encontré esta publicación nuevamente. Al igual que el círculo de la vida.
Ahora, cuál era el problema es: Rails 5.1 eliminó la compatibilidad con jquery y jquery_ujs de forma predeterminada, y agregó
Hace lo siguiente:
Pero, ¿por qué no incluye el token csrf para la solicitud ajax? Si alguien sabe sobre esto en detalle, solo coménteme. Soy consciente de que.
De todos modos, agregué lo siguiente en mi archivo js personalizado para que funcione (Gracias por otras respuestas para ayudarme a alcanzar este código):
fuente
jquery_ujs
. Ese fue el truco.Si no está utilizando jQuery y está utilizando algo como buscar API para solicitudes, puede usar lo siguiente para obtener
csrf-token
:document.querySelector('meta[name="csrf-token"]').getAttribute('content')
fuente
Utilice jquery.csrf ( https://github.com/swordray/jquery.csrf ).
Rieles 5.1 o posterior
Rieles 5.0 o anteriores
Código fuente
fuente
//= require jquery.csrf
no va a funcionar, ¿verdad? En su lugar, utilicé el archivo pack js conimport 'jquery.csrf'
él. Tenga en cuenta que no necesita incluir esto con una etiqueta de paquete en sus vistas.Si está utilizando JavaScript con jQuery para generar el token en su formulario, esto funciona:
Obviamente, necesitas tener el
<%= csrf_meta_tag %>
diseño en Ruby.fuente
Para aquellos de ustedes que necesitan una respuesta que no sea de jQuery, simplemente agreguen lo siguiente:
Un ejemplo muy simple se puede enviar aquí:
fuente
Luché con este problema durante días. Cualquier llamada GET funcionaba correctamente, pero todos los PUT generarían un error "No se puede verificar la autenticidad del token CSRF". Mi sitio web funcionaba bien hasta que agregué un certificado SSL a nginx.
Finalmente me topé con esta línea faltante en mi configuración de nginx:
Después de agregar la línea que falta "proxy_set_header X-Fordered-Proto https;", todos mis errores de token CSRF se cierran.
Esperemos que esto ayude a alguien más que también se golpea la cabeza contra la pared. jaja
fuente
Si alguien necesita ayuda relacionada con Uploadify y Rails 3.2 (como yo cuando busqué en Google esta publicación), esta aplicación de muestra puede ser útil: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb
También verifique la solución del controlador en esta aplicación
fuente
Estoy usando Rails 4.2.4 y no podía entender por qué estaba obteniendo:
Tengo en el diseño:
En el controlador:
Invocar
tcpdump -A -s 999 -i lo port 3000
mostraba el encabezado que se estaba configurando (a pesar de no tener que configurar los encabezados conajaxSetup
, ya estaba hecho):Al final estaba fallando porque tenía las cookies apagadas. CSRF no funciona sin las cookies habilitadas, por lo que esta es otra causa posible si está viendo este error.
fuente