Je travaillais sur une nouvelle application Rails 4 (sur Ruby 2.0.0-p0) lorsque j'ai rencontré des problèmes de jeton d'authenticité.
Lors de l'écriture d'un contrôleur qui répond à json (en utilisant la respond_to
méthode de classe), je suis arrivé à l' create
action que j'ai commencé à obtenir des ActionController::InvalidAuthenticityToken
exceptions lorsque j'ai essayé de créer un enregistrement en utilisant curl
.
J'ai fait en sorte de définir -H "Content-Type: application/json"
et j'ai défini les données avec -d "<my data here>"
mais toujours pas de chance.
J'ai essayé d'écrire le même contrôleur en utilisant Rails 3.2 (sur Ruby 1.9.3) et je n'ai eu aucun problème de jeton d'authenticité. J'ai cherché autour et j'ai vu qu'il y avait des changements avec les jetons d'authenticité dans Rails 4. D'après ce que je comprends, ils ne sont plus automatiquement insérés dans les formulaires? Je suppose que cela affecte en quelque sorte les types de contenu non HTML.
Existe-t-il un moyen de contourner cela sans avoir à demander un formulaire HTML, à arracher le jeton d'authenticité, puis à faire une autre demande avec ce jeton? Ou est-ce que je manque complètement quelque chose de complètement évident?
Edit: J'ai juste essayé de créer un nouvel enregistrement dans une nouvelle application Rails 4 en utilisant un échafaudage sans rien changer et je rencontre le même problème, donc je suppose que ce n'est pas quelque chose que j'ai fait.
before_action
qui vérifie le format et si la demande est vérifiée. Je ne connais aucun moyen intégré de fixer des conditions.skip_before_action :verify_authenticity_token
sur le contrôleur d'application de mon API pour que cela fonctionne.:verify_authenticy_token
dans Rails 4.2. Il est par défaut:null_session
, ce qui, comme son nom l'indique, vous donne simplement une demande sans session. Vous pouvez plutôt vérifier la demande via une clé API.Au lieu de désactiver la protection csrf, il est préférable d'ajouter la ligne de code suivante dans le formulaire
et si vous utilisez form_for ou form_tag pour générer le formulaire, il ajoutera automatiquement la ligne de code ci-dessus dans le formulaire
la source
L'ajout de la ligne suivante dans le formulaire a fonctionné pour moi:
la source
=token_tag nil
ou (en .erb)<%= token_tag nil %>
Je ne pense pas qu'il soit bon de désactiver généralement la protection CSRF tant que vous n'implémentez pas exclusivement une API.
En consultant la documentation de l'API Rails 4 pour ActionController, j'ai constaté que vous pouvez désactiver la protection contre la falsification par contrôleur ou par méthode.
Par exemple, pour désactiver la protection CSRF pour les méthodes que vous pouvez utiliser
la source
Je suis tombé sur le même problème. Corrigé en ajoutant à mon contrôleur:
la source
As-tu essayé?
la source
Ce document officiel - explique comment désactiver correctement la protection contre la contrefaçon pour les API http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
la source
Il s'agit d'une fonctionnalité de sécurité dans Rails. Ajoutez cette ligne de code sous la forme:
La documentation peut être trouvée ici: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
la source
Ces fonctionnalités ont été ajoutées à des fins de sécurité et de protection contre la contrefaçon.
Cependant, pour répondre à votre question, voici quelques entrées. Vous pouvez ajouter ces lignes après votre nom de contrôleur.
Ainsi,
Voici quelques lignes pour différentes versions de rails.
Rails 3
Rails 4 :
Si vous avez l'intention de désactiver cette fonction de sécurité pour toutes les routines de contrôleur, vous pouvez remplacer la valeur de protect_from_forgery par : null_session dans votre fichier application_controller.rb.
Ainsi,
la source
Si vous utilisez jQuery avec des rails, méfiez-vous de permettre l'entrée aux méthodes sans vérifier le jeton d'authenticité.
jquery-ujs peut gérer les jetons pour vous
Vous devriez déjà l'avoir dans le joyau jquery-rails, mais vous devrez peut-être l'inclure dans application.js avec
C'est tout ce dont vous avez besoin - votre appel ajax devrait maintenant fonctionner
Pour plus d'informations, voir: https://github.com/rails/jquery-ujs
la source
Ajouter
authenticity_token: true
à la balise de formulairela source
Lorsque vous définissez votre propre formulaire html, vous devez inclure une chaîne de jeton d'authentification, qui doit être envoyée au contrôleur pour des raisons de sécurité. Si vous utilisez l'aide de formulaire rails pour générer le jeton d'authenticité est ajouté au formulaire comme suit.
La solution au problème consiste donc à ajouter le champ authenticity_token ou à utiliser des aides de forme de rails plutôt que de compromettre la sécurité, etc.
la source
application/json
.Tous mes tests fonctionnaient bien. Mais pour une raison quelconque, j'avais défini ma variable d'environnement sur non-test:
J'ai oublié de désactiver cette variable à cause de laquelle j'ai commencé à recevoir une
ActionController::InvalidAuthenticityToken
exception.Après désarmement
$RAILS_ENV
, mes tests ont recommencé à fonctionner.la source