使用Ring reload时无法设置CSRF令牌

时间:2015-11-05 19:35:41

标签: clojure csrf clojurescript ring

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

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

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

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

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

我很确定这与我在上面提到的问题的答案中的评论所解决的问题有关。设置中间件默认值时,存在创建冗余行为的错误。

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

1 个答案:

答案 0 :(得分:1)

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

有关在github上的figwheel网站上运行可重新加载代码的有用说明。虽然这个描述是关于编写可重新加载的clojurescript,但是这些主体同样适用于服务器端。

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

查看luminus模板也许值得一看。它还使用ring-defaults,它可以非常好地处理csrf令牌。实际上,它使用了已扩展为包含csrf令牌的selmar模板,这使得修改和设置js var以保存令牌变得微不足道,因此使用具有ajax post请求的令牌非常容易。它也适用于自动重载。