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.