如何使用最新版本的ring / compojure使用ring anti-forgery / CSRF令牌?

时间:2015-05-11 16:10:50

标签: clojure ring compojure csrf-protection

我复制了一些在compojure 1.1.18和其他旧库中使用的旧代码,但是使用最新版本我无法使其工作。

这是我的minimal example codethe minimal example here复制来演示使用最新的铃声和组件库,当我发送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=someone@gmail.com" --header "X-CSRF-Token: 7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF" http://localhost:3000/send

我得到<h1>Invalid anti-forgery token</h1>

我做错了吗?

我借用的代码was intended to answer this question

1 个答案:

答案 0 :(得分:4)

问题在于ring-defaults(替换了compojure中的compojure.handler命名空间&gt; = 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行可解决问题。