¿Cómo puedo recuperar el token CSRF para pasar con una solicitud JSON?
Sé que, por razones de seguridad, Rails está verificando el token CSRF en todos los tipos de solicitud (incluido JSON / XML).
Podría poner mi controlador skip_before_filter :verify_authenticity_token
, pero perdería la protección CRSF (no es recomendable :-)).
Esta respuesta similar (aún no aceptada) sugiere
Recupera el token con
<%= form_authenticity_token %>
La pregunta es ¿cómo? ¿Necesito hacer una primera llamada a cualquiera de mis páginas para recuperar el token y luego hacer mi autenticación real con Devise? ¿O es una información única que puedo obtener de mi servidor y luego usar de manera consistente (hasta que la cambie manualmente en el servidor)?
fuente
protect_from_forgery with: :null_session, :if => Proc.new { |c| c.request.format == 'application/json' }
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
2) No relacionado con esta pregunta pero relacionado con el tema de PUBLICAR JSON desde iOS, ya que estoy usandoAFNetworking
y Rails no ajustaba los parámetros automáticamente, hice lo siguiente:manager.requestSerializer = [AFJSONRequestSerializer serializer];
Puede enviar el token CSRF, después de iniciar sesión correctamente, utilizando un encabezado personalizado.
Por ejemplo, ponga esto en sus sesiones # create:
response.headers['X-CSRF-Token'] = form_authenticity_token
Ejemplo de encabezado de respuesta de inicio de sesión que proporciona el token CSRF:
HTTP/1.1 200 OK Cache-Control: max-age=0, private, must-revalidate Connection: Keep-Alive Content-Length: 35 Content-Type: application/json; charset=utf-8 Date: Mon, 22 Oct 2012 11:39:04 GMT Etag: "9d719d3b9aabd413c3603e04e8a3933d" Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-10-12) Set-Cookie: [cut for readability] X-Csrf-Token: PbtMPfrszxH6QfRcWJCCyRo7BlxJUPU7HqC2uz2tKGw= X-Request-Id: 178746992d7aca928c876818fcdd4c96 X-Runtime: 0.169792 X-Ua-Compatible: IE=Edge
Este token es válido hasta que vuelva a iniciar sesión o (cierre la sesión si lo admite a través de su API). Su cliente puede extraer y almacenar el token de los encabezados de respuesta de inicio de sesión. Luego, cada solicitud POST / PUT / DELETE debe configurar el encabezado X-CSRF-Token con el valor recibido en el momento del inicio de sesión.
Ejemplos de encabezados POST con el token CSRF:
POST /api/report HTTP/1.1 Accept: application/json Accept-Encoding: gzip, deflate, compress Content-Type: application/json; charset=utf-8 Cookie: [cut for readability] Host: localhost:3000 User-Agent: HTTPie/0.3.0 X-CSRF-Token: PbtMPfrszxH6QfRcWJCCyRo7BlxJUPU7HqC2uz2tKGw=
Documentación: form_authenticity_token
fuente
De hecho, la forma más sencilla. No se moleste en cambiar los encabezados.
Asegúrate de tener:
en tus
layouts/application.html.erb
Simplemente haga un campo de entrada oculto como este:
<input name="authenticity_token" type="hidden" value="<%= form_authenticity_token %>"/>
O si quieres una publicación de jquery ajax:
$.ajax({ type: 'POST', url: "<%= someregistration_path %>", data: { "firstname": "text_data_1", "last_name": "text_data2", "authenticity_token": "<%= form_authenticity_token %>" }, error: function( xhr ){ alert("ERROR ON SUBMIT"); }, success: function( data ){ //data response can contain what we want here... console.log("SUCCESS, data="+data); } });
Básicamente, cuando publique sus datos json, simplemente agregue un campo Authenticity_token válido a los
post
datos y la advertencia debería desaparecer ...fuente
= token_tag(nil)
(nada es importante)Resolví ese error de esta manera:
class ApplicationController < ActionController::Base protect_from_forgery skip_before_action :verify_authenticity_token, if: :json_request? protected def json_request? request.format.json? end end
Fuente: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
fuente
protect_from_forgery with: :exception, unless: -> { request.format.json? }
y funcionó para mí. Gracias.Lo preocupante es que en Rails 3.2.3 ahora recibimos la advertencia CSRF en production.log, ¡pero la publicación no falla! Quiero que falle ya que me protege de los ataques. Y puede agregar el token csrf con jquery antes del filtro por cierto:
http://jasoncodes.com/posts/rails-csrf-vulnerability
fuente
He utilizado el siguiente. ¿Utilizando incluir? así que si el tipo de contenido es application / json; charset = utf-8 entonces todavía está funcionando.
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format.include? 'application/json' }
fuente
Esta respuesta es mejor.
Puede mantener la validación CSRF-TOKEN sin esfuerzo adicional (el token se adjunta) antes de cualquier envío XMLHttpRequest. Sin JQuery, sin nada, solo copiar / pegar y actualizar.
Simplemente agregue este código.
(function() { var send = XMLHttpRequest.prototype.send, token = $('meta[name=csrf-token]').attr('content'); XMLHttpRequest.prototype.send = function(data) { this.setRequestHeader('X-CSRF-Token', token); return send.apply(this, arguments); }; }());
fuente
Tuve el mismo problema con la siguiente versión de Rails:
gem 'rails',: git => 'git: //github.com/rails/rails.git',: branch => '3-2-stable'
Actualicé a 3.2.2 y ahora todo funciona bien para mí. :)
gem 'rieles', '3.2.2'
fuente
WARNING: Can't verify CSRF token authenticity
Me encontré con el mismo problema esta noche. La razón por la que sucede es porque cuando inicia sesión, el último token csrf ya no es válido. Lo que hice fue:
$("meta[name=csrf-token]").attr('content', '<%= form_authenticity_token %>');
en su aplicación / views / devise / sessions / create.js.rb.Ahora tiene un token csrf válido :) Espero que ayude
fuente
También para el modo de desarrollo / prueba.
protect_from_forgery with: :exception unless %w(development test).include? Rails.env
Esta advertencia se muestra porque está utilizando
:null_session
, en Rails 4.1 funciona de forma predeterminada si no sewith:
especifican opciones.fuente