使用bidi包装资源处理程序

时间:2016-03-08 18:20:53

标签: oauth clojure friend bidi

如何使用friend和bidi来包装资源处理程序?

我成功地让oAuth验证路线:

(defn auth-handler [request] (friend/authorize #{::user}
                                               {:status 200
                                                :body   "a secret"}))

(def routes ["/" {true auth-handler}])

(def app (make-handler routes))

(web/run-dmc (-> app
                   var
                   (friend/authenticate
                     {:allow-anon? true
                      :workflows   [(oauth/workflow
                                      {:client-config client-config
                                       :uri-config    uri-config
                                       :credential-fn credential-fn})]})
                   (wrap-resource "public")
                   (wrap-defaults site-defaults)
                   ))

这适用于'/'路由,但我想确保在没有先进行authing的情况下无法访问某些资源。

friend/wrap-authorize函数似乎可以实现:

我最近的尝试适用于auth包装的路由,但在非/ dev / routes上不匹配:

(def routes ["/" [["dev/" [[true (friend/wrap-authorize (resources {:prefix "dev/"}) #{::user})]]]
                  [true (resources {:prefix "public/"})]]])


(match-route routes "/dev/index.html")
=>
{:handler #object[cemerick.friend$wrap_authorize$fn__24411
              0x2400d0be
              "cemerick.friend$wrap_authorize$fn__24411@2400d0be"]}
;correct

(match-route routes "/index.html")
=>
nil
;not correct

我认为路由模式[true (resources {:prefix "public/"})]的匹配部分是错误的,因为当我将其更改为:key时,`index.html'确实匹配。

如何将非/ dev / *路由与公共资源匹配?

1 个答案:

答案 0 :(得分:2)

这里的主要问题是资源路径应该是

["" (resources {:prefix "public/"})]

空字符串而不是true

文档确实说明:匹配模式后,路径的剩余部分将添加到给定的前缀。

但坦率地说,我认为这是非常令人惊讶的行为。

我在这里创建了一个成功路由/index.html的最小示例项目 https://github.com/timothypratley/bidi-resources

值得注意的是,请求/index.html2会导致异常,这也不是我预期的。我期待404. o_O

我真的很喜欢ClojureScript中的bidi,但到目前为止我发现它在服务器端很难实现...我弄清楚为什么true不起作用的方法是覆盖资源定义我打印输出的版本,看到:remainder为空。