4

Ich habe gerade eine einfache App mit ein paar Formulare auf Rails 5.0.0beta3 gestartet.Rails 5.0.0beta3: ActionController :: InvalidAuthenticityToken in Entwicklung

In Entwicklung, mit http://localhost:3000 auf Safari oder Chrome auf die App zugreifen, wenn ich ein Formular ausfüllen und abschicken ich immer einen ActionController::InvalidAuthenticityToken Fehler. Allerdings, wenn ich die Seite vor dem Füllen und Senden neu laden, dann funktioniert es gut.

Die App nutzt die Standardwerte:

  • protect_from_forgery with: :exception in Application,
  • <%= csrf_meta_tags %> in HTML-Header durch Anwendung Layout
  • Entwicklungsumgebung wie durch Schienen geschaffen.

Beispiel:

<%= 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) 

Es funktioniert gut, wenn ich pro Form CSRF-Token in der Steuerung (self.per_form_csrf_tokens = false) so mein Problem zu deaktivieren ist wirklich auf diesem Niveau.

Die Sitzung scheint zu keinem Zeitpunkt zurückgesetzt zu werden.

Interessanterweise unterscheidet sich das Authentizitätstoken im Kopfzeilen-Menage-Tag beim ersten Laden des Formulars von dem Token im Formular. Das Meta-Tag befindet sich auch am Ende der Tags der Kopfzeile. Wenn ich dann neu lade, sind die Token sowohl im Meta-Tag als auch im Formular identisch, und das Meta-Tag befindet sich ganz oben in den Tags des Headers.

Update:

Ich denke, dass das Problem bis zu Turbolinks ist.

Wenn auf die Formularseite von einer anderen Seite in der App aus zugegriffen wird, wird von Turbolinks eine XHR-Anforderung ausgelöst, und ich stoße auf das Problem.

Wenn ich jedoch die Seite neu lade, lädt der Browser sie neu und ich sehe das Problem nicht.

+1

Sind Ihre Formulare erstellt mit 'form_for' und enthalten die richtigen CSRF-Eingänge? Es wird für normale synchrone Formulareinreichungen verwendet. Verwenden Sie eine Art Fragment-Caching, die ein "abgestandenes" CRSF-Meta-Tag liefern könnte? – max

+0

Gibt es Skriptfehler in der Browserkonsole? – max

+0

Ja, Formulare mit 'form_for' erstellt und enthält das Token (siehe Update meiner Frage). Caching ist in der Standardentwicklungsumgebung deaktiviert. Keine Fehler in der Browser-Konsole. – spicyhotpot

Antwort

5

Ich habe ein Problem auf Rails angesprochen.

Nach einer weiteren Untersuchung scheint es, dass die Frage nach Option :url in form_for zurückzuführen ist.

See: Issue #24257 (noch nicht aufgelöst)

+0

Falls es hilfreich ist, einen Kommentar dazu Ausgabe Verweise auf einen kleinen Hinweis in der README zu Rails 5: https://github.com/plataformatec/devise/pull/4033/files. Das hat meine Probleme behoben. –