Я использую реагент и compojure, чтобы сделать игрушку webapp, и я не могу понять, почему мой сервер не отправляет cookie CSRF. Другие ответы и несколько сообщений в блоге, по-видимому, подразумевают, что настройки по умолчанию для compojure теперь отправляют токен CSRF и что пересылка вручную на самом деле является ошибкой. Когда я пытаюсь попасть в конечную точку POST /art
, я возвращаю запретный ответ 403. Ни одна из страниц не получает cookie с токеном CSRF, поэтому я не могу отправить его с запросом POST. Любой совет?Приложение Compojure не отправляет CSRF по умолчанию
;;server.clj
(ns my-app.server
(:require [my-app.handler :refer [app]]
[environ.core :refer [env]]
[ring.adapter.jetty :refer [run-jetty]])
(:gen-class))
(defn -main [& args]
(let [port (Integer/parseInt (or (env :port) "3000"))]
(run-jetty app {:port port :join? false})))
;; handler.clj
(ns my-app.handler
(:require [compojure.core :refer [GET POST defroutes]]
[compojure.route :refer [not-found resources]]
[hiccup.page :refer [include-js include-css html5]]
[my-app.middleware :refer [wrap-middleware]]
[environ.core :refer [env]]))
(defroutes routes
(GET "/" [] loading-page)
(GET "/about" [] loading-page)
(GET "/art" [] loading-page)
(POST "/art" request {:sent (:body request) :hello "world"})
(resources "/")
(not-found "Not Found"))
(def app (wrap-middleware #'routes))
;;middleware.clj
(ns stagistry.middleware
(:require [ring.middleware.defaults :refer [site-defaults wrap-defaults]]
[prone.middleware :refer [wrap-exceptions]]
[ring.middleware.reload :refer [wrap-reload]]))
(defn wrap-middleware [handler]
(-> handler
(wrap-defaults site-defaults)
wrap-exceptions
wrap-reload))
Я бросил сам код на GitHub here, так как я до сих пор не может видеть то, что случилось.
Пожалуйста, разместите источник для 'wrap-middleware', поскольку это ключевая часть вашей проблемы. –
Мое впечатление, что обработка CSRF выполнялась в '(wrap-defaults site-defaults)', но это впечатление кажется неправильным. Руководство будет принята с благодарностью :) – BWStearns
'wrap-defaults' действительно обрабатывает CSRF: https://github.com/ring-clojure/ring-defaults/blob/master/src/ring/middleware/defaults.clj#L91 что версию вы используете? – OlegTheCat