2017-04-11 4 views
4

HintergrunddetailsAction :: InvalidAuthenticityToken Rails 5/Devise/Geprüfter/PaperTrail gem

Ich bin mit Devise zur Authentifizierung für eine Rails 5 Anwendung anzumelden.

Immer, wenn ich bündeln entweder die Geprüfter oder Paper Trail Juwel, wenn ich versuche, eine neue Sitzung #create (über das Zeichen in Form -/users/sign_in), erhalte ich folgende Fehlermeldung:

ActionController::InvalidAuthenticityToken 

Umwelt Details

Rubin 2.3.1

Gems:

  • Schienen 5.0.2
  • ersinnen => 4.2.1
  • paper_trail => 7.0.1

Schritte zum Reproduzieren des Problems:

  1. erstellen Rails 5 Anwendung
  2. hinzufügen Devise gem
  3. hinzufügen Geprüfter oder Paper Trail gem
  4. Versuch
+1

Haben Sie 'protect_from_forgery mit:: exception' in application_controller? – whodini9

+2

@ whodini9 - Bingo. Das war die Ursache des Fehlers. Ich habe es so geändert: 'protect_from_forgery prepend: true' Und dann waren die Dinge glücklich. Danke für die Hilfe. – aldefouw

Antwort

15

anmelden Wie sich herausstellt, Dokumentation Ausarbeitung ganz im Hinblick auf diesen Fehler ist aufschlußreich :

For Rails 5, note that protect_from_forgery is no longer prepended to the before_action chain, so if you have set authenticate_user before protect_from_forgery, your request will result in "Can't verify CSRF token authenticity." To resolve this, either change the order in which you call them, or use protect_from_forgery prepend: true.

Die Lösung war, Code in meinem Anwendungscontroller von diesem zu ändern:

protect_from_forgery with: :exception 

Um dies:

protect_from_forgery prepend: true 

Dieses Problem sich nicht manifestieren, bis ich das Hinzufügen Geprüfter oder Paper Trail Edelsteine ​​versucht.

+0

Arbeitete für mich seltsamerweise, wenn Sie noch angemeldet waren, das Problem nicht erscheint, so schien es intermittierend. – Steve

+1

@JohnLinux - Ich habe das Gleiche erlebt. Ich denke nicht, dass es jedoch intermittierend ist. Ich denke, dass Devise dich durch einen anderen Call-Stack schickt, wenn du eingeloggt bist. – aldefouw

+0

Das verursachte mir eine Menge Verwirrung und Frustration. Mehrere andere Beiträge erwähnen "Umzug", aber nicht spezifisch die Vorleistung. Vielen Dank. – DNorthrup

0

In meinem Projekt haben wir dieses Problem und wir können protect_from_forgery nicht überschreiben. Die gefundene Lösung zeigt das GitHub von audited an und arbeitete für mich.

Diese in gemfile:

gem "audited", github: "collectiveidea/audited" 
+1

Dies scheint keine Antwort auf die OP-Frage zu sein? – LethalProgrammer

+1

@ LethalProgrammer, sorry ich verstehe die OP Frage nicht. Meine Antwort ist, ohne edit _protect_from_forgery_ zu arbeiten, weil mein Projekt einen before_action Callback verwendet, um etwas vor dem Erstellen der Sitzung in devise zu validieren. Entschuldigung, wenn in meiner Antwort nicht klar ist. – msfreire

+0

@msfreire - schlagen Sie vor, dass Sie 'protect_from_forgery mit:: exception 'in Ihrem Anwendungscontroller verwenden können, wenn Sie den von Ihnen veröffentlichten github-Zweig verwenden? – aldefouw

0

Wie in den documentation erwähnt.

Für Rails 5 ist zu beachten, dass protect_from_forgery nicht mehr der Kette before_action vorangestellt ist. Wenn Sie also authenticate_user vor protect_from_forgery festgelegt haben, führt Ihre Anforderung zu "CSRF-Token-Authentizität kann nicht überprüft werden". Um dies zu beheben, ändern Sie entweder die Reihenfolge, in der Sie sie aufrufen, oder verwenden Sie protect_from_forgery prepend: true.

Ich habe so etwas verwendet und es funktioniert für mich.

class WelcomeController < ::Base 
    protect_from_forgery with: :exception 
    before_action :authenticate_model! 
end