如何使用最新版本的ring/compojure环防伪/ CSRF令牌?

sve*_*hie 7 clojure compojure ring csrf-protection

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

这里是我的小例子,代码从复制这里的小例子来证明,用最新环的Compojure库,我得到一个错误,当我发送一个HTTP POST,甚至与报头组.

lein ring server 启动它,然后做

curl -X GET --cookie-jar cookies "http://localhost:3000/" 结果是这样的:

{"csrf-token":"7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF"}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候

curl -X POST -v --cookie cookies -F "email=someone@gmail.com" --header "X-CSRF-Token: 7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF" http://localhost:3000/send
Run Code Online (Sandbox Code Playgroud)

我明白了 <h1>Invalid anti-forgery token</h1>

难道我做错了什么?

我借用的代码旨在回答这个问题.

sve*_*hie 5

问题是ring-defaults(它替换了compojure.handlercompojure >= 1.2 中的命名空间)anti-forgery在通常的使用模式下自动使用 ring :

(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)))
Run Code Online (Sandbox Code Playgroud)

因此正在生成两个防伪令牌,并且GET请求提供了无效的令牌。删除wrap-anti-forgery线解决了问题。