Ich habe an einer neuen Rails 4-App (unter Ruby 2.0.0-p0) gearbeitet, als ich auf Probleme mit Authentizitätstoken gestoßen bin.
Beim Schreiben eines Controllers, der auf json reagiert (mithilfe der respond_to
Klassenmethode), kam ich zu der create
Aktion, bei der ich ActionController::InvalidAuthenticityToken
Ausnahmen versuchte, als ich versuchte, einen Datensatz mit zu erstellen curl
.
Ich habe dafür gesorgt, dass ich -H "Content-Type: application/json"
die Daten eingestellt habe und mit, -d "<my data here>"
aber immer noch kein Glück.
Ich habe versucht, denselben Controller mit Rails 3.2 (unter Ruby 1.9.3) zu schreiben, und habe keinerlei Probleme mit Authentizitätstoken. Ich habe mich umgesehen und festgestellt, dass in Rails 4 einige Änderungen an Authentizitätstoken vorgenommen wurden. Soweit ich weiß, werden diese nicht mehr automatisch in Formulare eingefügt. Ich nehme an, dass dies irgendwie Auswirkungen auf Nicht-HTML-Inhaltstypen hat.
Gibt es eine Möglichkeit, dies zu umgehen, ohne ein HTML-Formular anfordern zu müssen, das Authentizitätstoken zu entreißen und dann eine weitere Anfrage mit diesem Token zu stellen? Oder fehlt mir etwas, das völlig offensichtlich ist?
Bearbeiten: Ich habe gerade versucht, einen neuen Datensatz in einer neuen Rails 4-App mithilfe eines Gerüsts zu erstellen, ohne etwas zu ändern, und ich habe das gleiche Problem, also habe ich es wohl nicht getan.
before_action
, die das Format und die Überprüfung der Anforderung überprüft. Ich kenne keine eingebaute Methode, um Bedingungen festzulegen.skip_before_action :verify_authenticity_token
dem Anwendungscontroller meiner API angeben , damit dies funktioniert.:verify_authenticy_token
in Rails 4.2 nicht mehr deaktivieren müssen. Der Standardwert ist:null_session
, dass Sie, wie der Name schon sagt, nur eine Anfrage ohne Sitzung erhalten. Sie können die Anforderung stattdessen über einen API-Schlüssel überprüfen.Anstatt den CSRF-Schutz zu deaktivieren, ist es besser, die folgende Codezeile in das Formular einzufügen
Wenn Sie form_for oder form_tag verwenden, um das Formular zu generieren, wird automatisch die obige Codezeile in das Formular eingefügt
quelle
Das Hinzufügen der folgenden Zeile zum Formular hat bei mir funktioniert:
quelle
=token_tag nil
oder (in .erb)<%= token_tag nil %>
Ich denke nicht, dass es gut ist, den CSRF-Schutz generell zu deaktivieren, solange Sie nicht ausschließlich eine API implementieren.
Wenn Sie sich die Rails 4-API-Dokumentation für ActionController ansehen ich fest, dass Sie den Fälschungsschutz pro Controller oder pro Methodenbasis deaktivieren können.
Zum Beispiel, um den CSRF-Schutz für Methoden zu deaktivieren, die Sie verwenden können
quelle
Kam über das gleiche Problem. Es wurde behoben, indem zu meinem Controller hinzugefügt wurde:
quelle
Hast du versucht?
quelle
In diesem offiziellen Dokument wird erläutert, wie der Fälschungsschutz für die API ordnungsgemäß deaktiviert wird. Http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
quelle
Dies ist eine Sicherheitsfunktion in Rails. Fügen Sie diese Codezeile in das folgende Formular ein:
Die Dokumentation finden Sie hier: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
quelle
Diese Funktionen wurden aus Sicherheits- und Fälschungsschutzgründen hinzugefügt.
Um Ihre Frage zu beantworten, finden Sie hier einige Eingaben. Sie können diese Zeilen nach dem Namen des Controllers hinzufügen.
Wie so,
Hier sind einige Zeilen für verschiedene Versionen von Schienen.
Schienen 3
Schienen 4 :
Wenn Sie diese Sicherheitsfunktion für alle Controller-Routinen deaktivieren möchten , können Sie den Wert von protected_from_forgery in Ihrer Datei application_controller.rb in null_session ändern .
Wie so,
quelle
Wenn Sie jQuery mit Rails verwenden, sollten Sie den Zugriff auf Methoden nicht zulassen, ohne das Authentizitätstoken zu überprüfen.
jquery-ujs kann die Token für Sie verwalten
Sie sollten es bereits als Teil des Edelsteins jquery-rail haben, müssen es jedoch möglicherweise in application.js mit aufnehmen
Das ist alles was Sie brauchen - Ihr Ajax-Anruf sollte jetzt funktionieren
Weitere Informationen finden Sie unter: https://github.com/rails/jquery-ujs
quelle
In
authenticity_token: true
dem Formular - Tagquelle
Wenn Sie Ihr eigenes HTML-Formular definieren, müssen Sie eine Authentifizierungs-Token-Zeichenfolge einschließen, die aus Sicherheitsgründen an den Controller gesendet werden soll. Wenn Sie den Rails Form Helper zum Generieren des Authentizitätstokens verwenden, wird das Formular wie folgt hinzugefügt.
Die Lösung des Problems besteht also darin, entweder das Feld authenticity_token hinzuzufügen oder Schienen von Helfern zu verwenden, anstatt die Sicherheit usw. zu gefährden.
quelle
application/json
.Alle meine Tests haben gut funktioniert. Aber aus irgendeinem Grund hatte ich meine Umgebungsvariable auf Nicht-Test gesetzt:
Ich habe vergessen, diese Variable zu deaktivieren, weshalb ich eine
ActionController::InvalidAuthenticityToken
Ausnahme bekam.Nach dem Deaktivieren
$RAILS_ENV
funktionierten meine Tests wieder.quelle