2015-11-04 21 views
1

Это мой код на стороне клиента. Я использую cljs-ajax для POSTcljs-ajax POST дает 403

(defn persist-state [] 
    (POST "/save" {:params {:state @state})) 

Вот мой код на стороне сервера для обработки POST. Я использую compojure.

(POST "/save" req 
     (let [state (:state (req :params))] 
      (add-state! state) 
      {:status 200})) 

Когда я запускаю ajax POST, он дает 403 запрещенную ошибку. Как мне обойти это? Не удалось найти что-либо онлайн, чтобы помочь мне.

Edit: Мой промежуточный слой выглядит следующим образом

(def app                   
    (let [handler (wrap-defaults #'routes site-defaults)]       
    (if (env :dev) (-> handler wrap-exceptions wrap-reload) handler))) 

Это было сгенерирован из шаблона в Lein реагента. Я довольно уверен, что моя проблема связана не с установкой токена анти-подделки.

+0

по умолчанию, compojure использует анти-подделку промежуточного программного обеспечения https://github.com/ring-clojure/ring-anti-forgery. у вас есть токен анти-подделки в вашем @state? – mavbozo

+0

нет. Я сделал еще несколько исследований и нашел, что моя проблема связана с этим вопросом [link] (http://stackoverflow.com/questions/20430281/set-ring-anti-forgery-csrf-header-token). –

+0

нам нужно будет увидеть ваше промежуточное ПО. –

ответ

2

Существует два основных способа решения вашей проблемы. Какие костюмы зависят от вашего приложения и того, что вы хотите.

Вариант 1. Если вы не хотите защиты CSRF, вы можете отключить его. Для этого вы можете отключить его, изменив карту сайта по умолчанию или вы можете использовать api-defaults вместо значений по умолчанию для сайтов (по умолчанию отключена поддержка csrf). Чтобы отключить его, вы могли бы сделать что-то вроде

(let [handler (wrap-defaults #'routes (assoc-in site-defaults [security :anti-forgery] false))] 
    .....) 

Варианта 2. Вы должны получить сервер для отправки текущих маркеров к вашему клиенту. Со статическими формами это обычно делается путем помещения маркера в скрытое поле внутри формы. Альтернативным для динамического контента, в котором вы используете javascript, является альтернативный доступ, чтобы сервер сгенерировал начальную страницу, которая устанавливает переменную js с маркером в ней.

Шаблон Luminus имеет довольно хороший пример того, как вы можете обращаться с этими токенами в гибкой манере. Он использует пакет Selmar для шаблонов и добавляет новый тег шаблона, который представляет токен csrf.

+0

Использование шаблона Luminus вместо шаблона реагента работало благодаря –

Смежные вопросы