【问题标题】:Can't set CSRF Token when using Ring reload使用 Ring reload 时无法设置 CSRF Token
【发布时间】:2015-11-05 19:35:40
【问题描述】:

目前正在为使用 Ring 的 POST 请求设置 CSRF 令牌。我一直在关注这个问题的答案作为指导Set Ring-Anti-Forgery CSRF header token。 遵循本指南后,我能够成功获取 csrf 令牌并使用 curl 发送 POST 请求。但是,我只能以不使用 (wrap-reload) 和我的应用处理程序为代价来做到这一点。

本指南将此代码用于应用处理程序

(def app
  (-> routes
      (wrap-defaults site-defaults)
      (wrap-session)))

但是,为了使用动态重新加载,我需要在开发过程中使用 (wrap-reload) 函数。像这样,

(def app
   (-> routes
       (wrap-defaults site-defaults)
       (wrap-session)
       (wrap-exception)
       (wrap-reload)))

我很确定这与 cmets 在回答我上面链接的问题时解决的问题有关。设置中间件默认值时存在创建冗余行为的错误。

无论如何我可以使用 wrap-reload 并仍然获得有效的 CSRF 令牌吗?

【问题讨论】:

  • 您的后端运行在 JVM 上,该代码正在设置您的环服务器,您可以使用 lein run 启动它。 Figwheel 设置 clojurescript 的自动编译。您的应用程序应该提供 html,然后调用 figwheel 的输出,它们是独立的进程,不应该发生冲突。我建议您发布一个指向最小工作示例的链接,否则您的问题真的很模糊。
  • 好的,我理解你关于无花果轮和环重装是独立过程的观点。我想我应该问我如何使用 ring 的 reload 功能并获得正确的 CSRF 令牌。获取 CSRF 令牌的最小工作示例在我发布的链接中。但它没有环重新加载。
  • wrap-reload 不会对 POST 请求做任何事情,请参阅 github.com/ring-clojure/ring/blob/1.4.0/ring-devel/src/ring/… 你能把例子放到 github 上并给出链接吗?
  • 编辑了我的问题,以更多地关注环的重新加载和 CSRF 令牌,而不是无花果或 POST 请求。但是,这个错误确实阻止了我使用带有环的 POST 请求,因为它需要 CSRF 令牌。此时我正在考虑手动设置开发令牌。
  • 我可以确认您应该能够毫无问题地执行此操作。我将它与 figwheel 一起使用,并使用标头中的 CSRF 令牌对服务器进行 jason 调用,并毫无问题地使用重新加载中间件。我不相信 figwheel 与它有任何关系,除非您以某种方式将 CSRF 令牌存储在客户端的 def 中,在这种情况下,您需要用 defonce 替换 def 以便在 figwheel 重新加载时不会丢失您的客户端clojurescript。没有足够的细节来更具体。

标签: clojure csrf clojurescript ring


【解决方案1】:

没有足够的信息来提供您可能出现问题的具体细节。但是,一些一般提示可能有用。

github 上的 figwheel 网站上有一个关于运行可重载代码的有用描述。虽然此描述是关于编写可重新加载的 clojurescript,但原则同样适用于服务器端。

自动重新加载可能导致您的防伪令牌出现问题的原因可能是会话存储在“def”而不是 defonce 中。这意味着当重新加载存储会话的文件时,您的会话数据将丢失,这可能意味着您的 csrf 令牌也丢失/替换为新值。

查看 luminus 模板也可能是值得的。它还使用 ring-defaults 并且可以很好地处理 csrf 令牌内容。事实上,它使用了 selmar 模板,该模板已扩展为包含 csrf 令牌,这使得修改和设置 js var 来保存令牌变得很简单,因此将令牌与 ajax 发布请求一起使用非常容易。它也适用于自动重新加载。

【讨论】:

  • Luminus 模板很有帮助
猜你喜欢
  • 2018-01-27
  • 2013-12-24
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2016-10-03
  • 2015-08-24
相关资源
最近更新 更多