2015-05-11 13 views
6

Ich habe alten Code kopiert, der in Compojure 1.1.18 und anderen alten Bibliotheken funktioniert hat, aber mit den neuesten Versionen kann ich es nicht zum Laufen bringen.Wie kann ich Ring-Anti-Fälschung/CSRF-Token mit der neuesten Version Ring/Compojure verwenden?

Hier ist mein minimal example code von the minimal example here kopiert zu zeigen, dass mit dem neuesten Ring und compojure Bibliotheken, ich erhalte eine Fehlermeldung, wenn ich einen http POST, auch mit dem Kopfsatz senden.

lein ring server es zu starten, dann

tun

curl -X GET --cookie-jar cookies "http://localhost:3000/", die wie folgt in etwas ergibt:

{"csrf-token":"7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF"} 

Aber wenn ich tun, um diese

curl -X POST -v --cookie cookies -F "[email protected]" --header "X-CSRF-Token: 7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF" http://localhost:3000/send 

ich <h1>Invalid anti-forgery token</h1>

Am Ich mache etwas falsch ?

Der Code ich ausgeliehen was intended to answer this question.

+0

im Dunkeln gedreht, aber die Vorwärts Schrägstriche (im Token) mit Backslashes machen einen Unterschied machen? – lispHK01

+0

Danke! James Reeves/webenjester, Autor von compojure und [maintainer von ring anti-forgery haben mir mitgeteilt, dass die neuen 'wrap-defaults' und' site-defaults' im 'ring-defaults' Paket (https://github.com/ring-clojure/ring-anti-forgery/issues/10), das den veralteten '' handler''-Namespace ersetzt, benötigt automatisch CSRF-Tokens für HTTP 'POST' et al. Also generiert mein Code das Token zweimal und ich verifiziere gegen das falsche. Ich arbeite an einer Reparatur ... – sventechie

Antwort

3

Das Problem war, dass ring-defaults (die den compojure.handler Namespace in compojure ersetzt> = 1.2) automatisch Ring anti-forgery in der üblichen Art der Verwendung verwendet:

(defroutes app-routes 
    (GET "/" [] (generate-string {:csrf-token 
           *anti-forgery-token*})) 
    (POST "/send" [email] "ok") 
    (resources "/") 
    (not-found "Not Found")) 

(def app 
    (-> app-routes 
    (wrap-defaults site-defaults))) 

So zwei Fälschungs Token erzeugt werden wurden und die GET Anfrage zur Verfügung gestellt die ungültige. Das Entfernen der wrap-anti-forgery Zeile behob das Problem.

+0

Sie können Ihre eigene Frage als beantwortet markieren, wenn Sie mit dem Ergebnis zufrieden sind. –