post clojure compojure antiforgerytoken

No se puede completar la solicitud POST en Clojure



compojure antiforgerytoken (3)

Su problema es con la configuración de valores predeterminados de envoltura y valores predeterminados del sitio. La configuración predeterminada de los valores predeterminados del sitio agrega la protección CSRF de ant9forgery y se bloqueará cualquier solicitud posterior que no incluya un token CSRF válido.

Hay un par de maneras de evitar esto

  1. Use api-defaults en lugar de los predeterminados del sitio. La configuración predeterminada de api-defaults es para los sitios en los que se está ofreciendo una API web y los cambios de la protección CSRF incluidos en los valores predeterminados del sitio, que están destinados a un sitio web más tradicional donde las solicitudes de publicación se generan mediante un formulario que se entregó anteriormente a través de una solicitud de obtención e incluye el csrf-token como un campo oculto. La desventaja de esta solución es que también puede deshabilitar otro middleware que desee incluir

  2. Deshabilite la protección csrf en la configuración predeterminada del sitio. Esto implica establecer el valor clave apropiado en el mapa como falso, es decir
    (wrap-defaults app-routes (assoc-in site-defaults [:security :anti-forgery] false))

Recientemente comencé a explorar Clojure y quería configurar una aplicación web simple con funcionalidad CRUD básica. Encontré un buen tutorial aquí: http://www.xuan-wu.com/2013-09-21-Basic-Web-Application-in-Clojure .

Las solicitudes GET funcionan bien, pero cada vez que intento una solicitud posterior, aparece el siguiente error:

Invalid anti-forgery token

El tutorial que mencioné anteriormente no trata nada relacionado con la seguridad. Hice algunas excavaciones y parece que me estoy perdiendo algún componente de Compojure que se supone genera un token para realizar solicitudes POST. Algunos lugares mencionaron que se suponía que debía pasar automáticamente sin ningún cambio de mi parte. Todavía no estoy seguro de qué es lo que me estoy perdiendo. Aquí está mi código:

(ns myblog.handler (:require [compojure.core :refer :all] [compojure.route :as route] [ring.middleware.defaults :refer [wrap-defaults site-defaults]] [myblog.views :as views] [myblog.posts :as posts] [ring.util.response :as resp] [ring.middleware.basic-authentication :refer :all])) (defn authenticated? [name pass] (and (= name "user") (= pass "pass"))) (defroutes public-routes (GET "/" [] (views/main-page)) (route/resources "/")) (defroutes protected-routes (GET "/admin" [] (views/admin-page)) (GET "/admin/add" [] (views/add-post)) (POST "/admin/create" [& params] (do (posts/create params) (resp/redirect "/admin")))) (defroutes app-routes public-routes (wrap-basic-authentication protected-routes authenticated?) (route/not-found "Not Found")) (def app (wrap-defaults app-routes site-defaults))

Nuevamente, solo la solicitud POST "/ admin / create" está fallando con el error de token no válido. ¿Alguna idea de lo que estoy haciendo mal?


Ver este example github. Cabe destacar en la parte inferior:

ring-default incluye antifalsificación por defecto para solicitudes POST (y otras que modifican datos).

Creo que necesitas cambiar tu uso de los valores predeterminados si no quieres esto:

wrap-defaults routes site-defaults

Si no desea desactivarlo, debe enviar un formulario con un campo oculto con el token o pasarlo en un encabezado a través de X-CSRF-Token y X-XSRF-Token . Consulte los docs middleware del anillo para obtener información sobre la falsificación del anillo.


agregue un campo oculto a su formulario, por ejemplo, use enlive-html:

(ns xxx.html (:use [net.cgrand.enlive-html]) (:require [clojure.string :as str] [ring.util.anti-forgery :refer [anti-forgery-field]])) (deftemplate render-page "base.html" [settings] [:form#my-form] (append (html-snippet (anti-forgery-field))) ... )

o deshabilitarlo, no lo recomiendo, como:

(def app (wrap-default default-route (assoc-in site-default) [: security: anti-falsificación] false))