如何在最新版本 ring/compojure 中使用环 anti-forgery / CSRF 令牌?
How can I use ring anti-forgery / CSRF token with latest version ring/compojure?
我复制了一些在 compojure 1.1.18 和其他旧库中工作的旧代码,但使用最新版本我无法让它工作。
这是我的 minimal example code copied from the minimal example here 来演示使用最新的 ring 和 compojure 库,当我发送 http POST
时出现错误,即使设置了 header。
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.
问题是 ring-defaults
(它取代了 compojure 中的 compojure.handler
命名空间 >= 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
行解决了问题。
我复制了一些在 compojure 1.1.18 和其他旧库中工作的旧代码,但使用最新版本我无法让它工作。
这是我的 minimal example code copied from the minimal example here 来演示使用最新的 ring 和 compojure 库,当我发送 http POST
时出现错误,即使设置了 header。
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.
问题是 ring-defaults
(它取代了 compojure 中的 compojure.handler
命名空间 >= 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
行解决了问题。