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

这是从minimal example code复制的the minimal example here,以证明在使用最新的ring和compojure库时,即使发送了 header ,发送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>
难道我做错了什么?

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

最佳答案

问题是ring-defaults(在compojure> = 1.2中替换了compojure.handler命名空间)在通常的使用模式下自动使用了ring 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)))

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

10-08 12:46