Rails: impossible de vérifier l’authenticité du jeton CSRF lors d’une requête POST

Je veux faire une POST request à mon développeur local, comme ceci:

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

Cependant, à partir de la console du serveur, il rapporte

 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 

Voici la configuration de mon contrôleur et de mes itinéraires, c’est assez 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' 

Je ne suis pas sûr de ce que je dois faire? Désactiver le CSRF fonctionnerait certainement, mais je pense que ce devrait être mon erreur lors de la création d’une telle API.

Y a-t-il d’autres configurations à faire?

La falsification de références intersites se produit lorsqu’une page Web malveillante incite les utilisateurs à exécuter une requête qui n’est pas destinée, par exemple, à l’utilisation de bookmarklets, d’iframes ou simplement en créant une page suffisamment similaire pour tromper les utilisateurs.

La protection Rails CSRF est conçue pour les applications Web «classiques». Elle garantit simplement que la demande provient de votre propre application Web. Un jeton CSRF fonctionne comme un secret que seul votre serveur connaît – Rails génère un jeton aléatoire et le stocke dans la session. Vos formulaires envoient le jeton via une entrée masquée et Rails vérifie que toute demande non GET inclut un jeton correspondant à ce qui est stocké dans la session.

Cependant, une API est généralement par définition un site partagé et destinée à être utilisée dans plus que votre application Web, ce qui signifie que le concept entier de CSRF ne s’applique pas tout à fait.

Au lieu de cela, vous devez utiliser une stratégie d’authentification des demandes d’API basée sur des jetons avec une clé API et secrète, car vous vérifiez que la demande provient d’un client API approuvé et non de votre propre application.

Vous pouvez désactiver CSRF comme indiqué par @dcestari:

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

Actualisé. Dans Rails 5, vous pouvez générer des applications API uniquement à l'aide de l'option --api :

 rails new appname --api 

Ils n'incluent pas le middleware CSRF et de nombreux autres composants superflou.

Une autre façon de désactiver CSRF qui ne rendra pas une session null consiste à append:

skip_before_action :verify_authenticity_token dans votre contrôleur Rails. Cela garantira que vous avez toujours access aux informations de session.

Encore une fois, assurez-vous de ne le faire que dans les contrôleurs API ou dans d’autres endroits où la protection CSRF ne s’applique pas tout à fait.

Il existe des informations pertinentes sur une configuration de CSRF par rapport aux contrôleurs d’API sur api.rubyonrails.org :

Il est important de se rappeler que les requêtes XML ou JSON sont également affectées et que si vous créez une API, vous devez modifier la méthode de protection contre la falsification dans ApplicationController (par défaut :exception ):

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

Nous pouvons vouloir désactiver la protection CSRF pour les API car elles sont généralement conçues pour être sans état. C’est-à-dire que le client API de requête va gérer la session pour vous au lieu de Rails.