tutorial software rails ejemplos descargar curso caracteristicas ruby-on-rails

ruby-on-rails - software - ruby on rails tutorial



Rieles: no se puede verificar la autenticidad del token CSRF al realizar una solicitud POST (5)

Quiero hacer POST request a mi desarrollador local, así:

HTTParty.post(''http://localhost:3000/fetch_heroku'', :body => {:type => ''product''},)

Sin embargo, desde la consola del servidor informa

Started POST "/fetch_heroku" for 127.0.0.1 at 2016-02-03 23:33:39 +0800 ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations".* FROM "schema_migrations" Processing by AdminController#fetch_heroku as */* Parameters: {"type"=>"product"} Can''t verify CSRF token authenticity Completed 422 Unprocessable Entity in 1ms

Aquí está mi controlador y configuración de rutas, es bastante simple.

def fetch_heroku if params[:type] == ''product'' flash[:alert] = ''Fetch Product From Heroku'' Heroku.get_product end end post ''fetch_heroku'' => ''admin#fetch_heroku''

No estoy seguro de lo que tengo que hacer? Apagar el CSRF ciertamente funcionaría, pero creo que debería ser mi error al crear una API de este tipo.

¿Hay alguna otra configuración que deba hacer?


En Rails 5 también puede crear una nueva clase con ::API lugar de :: Base:

class ApiController < ActionController::API end


Hay información relevante sobre una configuración de CSRF con respecto a los controladores API en api.rubyonrails.org :

Es importante recordar que las solicitudes XML o JSON también se ven afectadas y si está creando una API , debe cambiar el método de protección de falsificación en ApplicationController (por defecto :exception ):

class ApplicationController < ActionController::Base protect_from_forgery unless: -> { request.format.json? } end

Es posible que deseemos deshabilitar la protección CSRF para las API, ya que generalmente están diseñadas para no tener estado. Es decir, el cliente API solicitud manejará la sesión por usted en lugar de Rails.


La falsificación de solicitudes de sitios cruzados (CSRF / XSRF) es cuando una página web maliciosa engaña a los usuarios para que realicen una solicitud que no está diseñada, por ejemplo, mediante el uso de marcadores, iframes o simplemente creando una página que sea lo suficientemente visual como para engañar a los usuarios.

La protección CSRF de Rails está hecha para aplicaciones web "clásicas": simplemente garantiza que la solicitud se originó en su propia aplicación web. Un token CSRF funciona como un secreto que solo su servidor conoce: Rails genera un token aleatorio y lo almacena en la sesión. Sus formularios envían el token a través de una entrada oculta y Rails verifica que cualquier solicitud no GET incluya un token que coincida con lo que está almacenado en la sesión.

Sin embargo, una API es, por definición, un sitio cruzado y está destinada a ser utilizada en más de su aplicación web, lo que significa que todo el concepto de CSRF no se aplica del todo.

En su lugar, debe usar una estrategia basada en tokens para autenticar las solicitudes de API con una clave y secreto de API, ya que está verificando que la solicitud proviene de un cliente API aprobado, no de su propia aplicación.

Puede desactivar CSRF como lo señala @dcestari:

class ApiController < ActionController::Base protect_from_forgery with: :null_session end

Actualizado. En Rails 5, puede generar aplicaciones solo de API utilizando la opción --api :

rails new appname --api

No incluyen el middleware CSRF y muchos otros componentes que son superfluos.


Otra forma de desactivar CSRF que no representará una sesión nula es agregar:

skip_before_action :verify_authenticity_token

en su controlador de rieles. Esto asegurará que aún tenga acceso a la información de la sesión.

Nuevamente, asegúrese de hacer esto solo en los controladores API o en otros lugares donde la protección CSRF no se aplique del todo.


Si desea excluir la acción de muestra del controlador de muestra

class TestController < ApplicationController protect_from_forgery :except => [:sample] def sample      render json: @hogehoge end end

Puede procesar solicitudes desde el exterior sin ningún problema.