post - 无法在 Clojure 中完成 POST 请求

标签 post clojure compojure antiforgerytoken

我最近开始探索 Clojure,我想设置一个具有基本 CRUD 功能的简单 Web 应用程序。我在这里找到了一个不错的教程:http://www.xuan-wu.com/2013-09-21-Basic-Web-Application-in-Clojure .

GET 请求工作正常,但每当我尝试发布请求时,我都会收到以下错误:

Invalid anti-forgery token

我之前提到的教程没有解决任何与安全相关的问题。我做了一些挖掘,似乎我缺少 Compojure 的某些组件,该组件应该生成用于发出 POST 请求的 token 。有些地方提到我应该自动发生,而我没有任何改变。我仍然不确定我错过了什么。这是我的代码:
(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))

同样,只有 POST 请求“/admin/create”因无效 token 错误而失败。知道我做错了什么吗?

最佳答案

您的问题在于 wrap-defaults 和 site-defaults 设置。 site-defaults 默认配置添加了 ant9forgery CSRF 保护,任何不包含有效 CSRF-token 的 post 请求都将被阻止。

有几种方法可以解决这个问题

  • 使用 api-defaults 而不是 site-defaults。 api-defaults 默认配置适用于您提供 Web API 的站点以及 site-defaults 中包含的 CSRF 保护的轮换,这适用于更传统的网站,其中发布请求是由以前交付的表单生成的通过获取请求并将 csrf-token 作为隐藏字段包含在内。此解决方案的缺点是它也可能禁用您希望包含的其他中间件
  • 在站点默认配置中禁用 csrf 保护。这涉及将映射中的适当键值设置为 false,即(wrap-defaults app-routes (assoc-in site-defaults [:security :anti-forgery] false))
  • 关于post - 无法在 Clojure 中完成 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33132131/

    相关文章:

    php - 需要帮助来比较 PHP 和 DB 的值(value),$_POST 不起作用..?

    php - 我可以使用 ssl ://and https://in an URL interchangeably? 吗

    documentation - Clojure文档工具的最新技术

    clojure - 如何简化 Compojure 路线?

    clojure - java.lang.IllegalArgumentException : No implementation of method: :route-matches of protocol: #'clout. 核心/路由

    javascript - 通过 POST 的图像响应

    php - Laravel AJAX Post 数组在服务器上变空

    clojure - 试剂中的交互式列表

    Clojure 函数参数语法

    clojure - 我应该在哪里保存简单的配置设置?