4

Je viens de démarrer une application simple avec un couple de formulaires sur Rails 5.0.0beta3.Rails 5.0.0beta3: ActionController :: InvalidAuthenticityToken en développement

En développement, en utilisant http://localhost:3000 sur Safari ou Chrome pour accéder à l'application, si je remplis un formulaire et l'envoie, je reçois toujours une erreur ActionController::InvalidAuthenticityToken. Toutefois, si je recharge la page avant de la remplir et de la soumettre, cela fonctionne correctement.

L'application utilise les paramètres par défaut:

  • protect_from_forgery with: :exception à ApplicationController,
  • <%= csrf_meta_tags %> en-tête html par la mise en page de l'application,
  • environnement de développement
  • tel que créé par des rails.

Exemple:

<%= form_for @node, url: admin_book_nodes_url, as: :node do |form| %> 
    <%= render "form", f: form %> 
    <p><%= form.submit %> or <%= link_to "Cancel", admin_book_nodes_path %></p> 
<% end %> 

Log:

Started POST "/admin/book/nodes" for ::1 at 2016-03-20 11:54:31 +0000 
Processing by Admin::Book::NodesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"/G5pF6hSPx0Vf21Fi0FCh+VlOcHY4w8C5lmHmwr3NQRjfXUP9/xboybeV3tevmyTyHcwSX8LplU/HgZVGDbGlw==", "node"=>{"parent_id"=>"1", "position"=>"1", "title"=>"lkjlkj", "description"=>"lkjlj", "published"=>"0", "content"=>"lkjlkj"}, "commit"=>"Create node"} 
Can't verify CSRF token authenticity 
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms) 

Il fonctionne très bien si je désactive par jetons sous forme de CSRF dans le contrôleur (self.per_form_csrf_tokens = false) donc ma question est vraiment à ce niveau.

La session ne semble réinitialisée à aucun moment. Il est intéressant de noter que lorsque le formulaire est chargé pour la première fois, le jeton d'authenticité de l'étiquette de menage de l'en-tête est différent du jeton dans le formulaire. La balise meta est également au bas des balises de l'en-tête. Lorsque je recharge ensuite les jetons sont les mêmes dans la balise meta et le formulaire, et la balise meta est en haut des balises de l'en-tête.

Mise à jour:

Je pense que la question est en baisse à Turbolinks. Lorsque la page de formulaire est accessible à partir d'une autre page de l'application, une requête XHR est renvoyée par Turbolinks et je rencontre le problème.

Cependant, lorsque je recharge la page, le navigateur la recharge et je ne vois pas le problème.

+1

sont vos formulaires créés avec 'form_for' et contiennent les entrées CSRF correctes? Il est utilisé pour les présentations normales de forme syncrous. Utilisez-vous une sorte de mise en cache de fragments qui pourrait délivrer une méta-balise CRSF «périmée»? – max

+0

Y a-t-il des erreurs de script dans la console du navigateur? – max

+0

Oui, les formulaires créés avec 'form_for' et contenant le jeton (voir mise à jour de ma question). La mise en cache est désactivée dans l'environnement de développement par défaut. Aucune erreur dans la console du navigateur. – spicyhotpot

Répondre

5

J'ai soulevé un problème sur Rails. Après un examen plus approfondi, il semble que le problème est dû à l'option :url dans form_for.

Voir: Issue #24257 (non encore résolu)

+0

Dans le cas où cela serait utile, un commentaire à ce sujet question fait référence à une petite note int il conçoit README concernant Rails 5: https://github.com/plataformatec/devise/pull/4033/files. Cela a réglé mes problèmes. –