http/post Токен защиты от подделки с :edn-params

У меня есть следующая установка:

  1. Macchiato для серверной части (например, ClojureScript на node.js), какие модели обращаются на Ring.
  2. Внешний интерфейс, состоящий из небольшого приложения React для редактирования данных, хранящихся в атоме (отслеживание различных входных данных).

Я хочу сделать данные, хранящиеся в этом атоме, постоянными, отправив их обработчику в моем бэкэнде. Казалось бы, самый простой способ сделать это — просто взять данные прямо из атома и сделать следующее:

(http/post "https://post.here.url"
                                {:edn-params
                                 @my-atom})

Однако: по умолчанию Macchiato требует, чтобы POST-запросы включали маркер защиты от подделки (который я в настоящее время храню как атрибут одного из моих HTML-элементов; пожалуйста, сообщите мне, если это плохая практика). Итак, я попробовал следующее:

(http/post "https://post.here.url"
                                {:edn-params
                                 {:data @my-atom
                  :__anti-forgery-token "SuperSecretToken"}})

Однако это не работает, поскольку токен отклоняется как недействительный. Токен защиты от подделки, похоже, обрабатывается правильно, только если я объявляю данные как :form-params:

(http/post "https://post.here.url"
                                {:form-params
                                 {:data (str @my-atom)
                  :__anti-forgery-token "SuperSecretToken"}})

Описанный выше метод действительно работает, но, конечно, тип MIME установлен неправильно, и мне приходится кое-что делать, чтобы сделать данные EDN доступными на стороне сервера. Подход просто кажется неправильным. Есть ли способ правильно сериализовать данные EDN и по-прежнему передавать маркер защиты от подделки?

Я все еще новичок в этом деле, поэтому, возможно, я упускаю что-то основное. Я ошибаюсь в отношении цели токена защиты от подделки в целом? Имеет ли это смысл только при передаче данных формы (что на самом деле и есть мои данные; просто размещение атома напрямую значительно упростило бы перезагрузку сохраненных данных).

Большое спасибо за любой вклад, который вы можете мне дать!

Оливер


person Phylax    schedule 21.03.2020    source источник


Ответы (1)


Немного сложно понять, как настроены документы прямо сейчас, но вот 3 полезных фрагмента информации:

  1. https://macchiato-framework.github.io/api/core/macchiato.middleware.anti-forgery.html
  2. https://github.com/macchiato-framework/macchiato-core/blob/master/src/macchiato/middleware/defaults.cljs#L83
  3. https://macchiato-framework.github.io/docs/restful-middleware.html

Если вы используете оболочку промежуточного программного обеспечения wrap-defaults, вы можете передать значение параметров, которое либо является правдивым (включение поведения защиты от подделки по умолчанию, как вы наблюдаете), либо карту параметров, которая, как говорится в документе в [1], принимает необязательный :read-token функция.

Вместе, плюс rest-middleware в [3], вот один из способов реализовать проверку на подделку, которая принимает значение по умолчанию (параметры формы) или полезную нагрузку json (параметры тела):

(-> handler
    ;; note: the wrapped middleware request processing
    ;; is handled _bottom-up_ in this chain
    (defaults/wrap-defaults
     (-> defaults/site-defaults
         (assoc-in [:security :anti-forgery]
                   {:read-token (fn [request]
                                  (or
                                   ;; check the custom key we set upstream (but in the block below)
                                   (get-in request [:anti-forgery-payload])
                                   ;; default behavior
                                   (anti-forgery/default-request-token request)))})))
    (middleware/wrap
     (fn extract-anti-forgery-payload [handler]
       (fn [request respond raise]
         (handler
          (if-let [anti-forgery-payload
                   (get-in request [:body "__anti-forgery-token"])]
            (-> request
                ;; add our custom anti-forgery key to the request
                (assoc :anti-forgery-payload anti-forgery-payload)
                ;; remove the special key from the request to downstream handlers
                (update :body dissoc "__anti-forgery-token"))
            request)
          respond raise)))
     {})
    ;; decodes the json input into maps
    (macchiato.middleware.restful-format/wrap-restful-format))
person whacked    schedule 29.09.2020