2015-05-11 6 views
6

Я скопировал какой-то старый код, который работал в compojure 1.1.18 и других старых библиотеках, но с использованием последних версий я не могу заставить его работать.Как использовать кольцевой анти-подделку/CSRF-токен с последней версией ring/compojure?

Вот мой minimal example code скопирована с the minimal example here, чтобы продемонстрировать, что с последним кольцом и compojure библиотек, я получаю сообщение об ошибке, когда я отправить HTTP POST, даже с набором заголовка.

lein ring server запустить его, а затем сделать

curl -X GET --cookie-jar cookies "http://localhost:3000/" что приводит к чему-то вроде этого:

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

Но когда я делаю это

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

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

Am Я делаю что-то неправильно ?

Код, который я заимствовал was intended to answer this question.

+0

снято в темноте, но выходит из-под косых черт (в токене), используя обратную косую черту, имеет какое-то значение? – lispHK01

+0

Спасибо! Джеймс Ривз/weavejester, автор compojure и [сторонник кольцевой анти-подделки сказал мне, что новые 'wrap-defaults' и' site-defaults' в пакете 'ring-defaults'] (https://github.com/ring-clojure/ring-anti-подделка/проблемы/10), который заменяет устаревшее пространство имен обработчика 'handler', автоматически требует токенов CSRF для HTTP' POST' и др. Таким образом, мой код генерирует токен дважды, и я проверяю неверный. Я работаю над исправлением ... – sventechie

ответ

3

Проблема заключалась в том, что ring-defaults (который заменяет compojure.handler пространство имен в compojure> = 1.2) автоматически использует кольцо anti-forgery в обычном режиме использования:

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

Так два анти-подделки маркеры были генерируется, и GET запрос предоставлен неверный. Проблема с удалением wrap-anti-forgery.

+0

Вы можете пометить свой вопрос как ответ, если вы довольны результатом. –