2015-05-11 15 views
6

Ho copiato un vecchio codice che stava lavorando in Compojure 1.1.18 e altre vecchie librerie, ma usando le ultime versioni non riesco a farlo funzionare.Come posso usare il token anti-contraffazione/CSRF ad anello con l'ultima versione ring/compojure?

Ecco la mia minimal example code copiato da the minimal example here per dimostrare che con le ultime librerie anello e compojure, ottengo un errore quando invio una http POST, anche con il set di intestazione.

lein ring server per avviarlo, quindi fare

curl -X GET --cookie-jar cookies "http://localhost:3000/" che si traduce in qualcosa di simile a questo:

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

Ma quando faccio questo

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

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

Am Sto facendo qualcosa di sbagliato ?

Il codice che ho preso in prestito was intended to answer this question.

+0

sparato al buio ma sfuggire alle barre in avanti (nel token) utilizzando i backslash fa la differenza? – lispHK01

+0

Grazie! James Reeves/weavejester, autore di compojure e [manutentore dell'anello anti-contraffazione mi ha detto che il nuovo 'wrap-defaults' e' site-defaults' nel pacchetto 'ring-defaults'] (https://github.com)/ring-clojure/ring-anti-forgery/issues/10) che sostituisce il deprecato dominio 'handler' compojure richiede automaticamente token CSRF per HTTP' POST' et al. Quindi il mio codice genera il token due volte e io verifica contro quello sbagliato. Sto lavorando a una correzione ... – sventechie

risposta

3

Il problema era che ring-defaults (che sostituisce lo spazio dei nomi compojure.handler in compojure> = 1.2) utilizza automaticamente anello anti-forgery nella solita modalità di utilizzo:

(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))) 

Così due token anti-contraffazione venivano generati e la La richiesta GET ha fornito quella non valida. La rimozione della riga wrap-anti-forgery risolve il problema.

+0

È possibile contrassegnare la propria domanda come risposta se si è soddisfatti del risultato. –