2016-03-08 49 views
2

如何使用friend和bidi来包装资源处理程序?用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) 
        )) 

该工程对“/”路线,但我想,以确保一些资源,如果不首先验证中达到。

这似乎是可能与friend/wrap-authorize功能:

我最亲密的尝试工作的权威性包裹路线,但不匹配的非的/ dev /路线:

(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 
       "[email protected]"]} 
;correct 

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

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

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

回答

2

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

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

空字符串,而不是true

该文档确实状态:匹配模式后,路径的其余部分将添加到给定的前缀中。

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

我在这里做了一个小例子,项目成功的路线/index.html https://github.com/timothypratley/bidi-resources

值得注意的是,在请求一个例外,这又不是我所期待的所有/index.html2结果。我期待一个404. o_O

我真的很喜欢在ClojureScript中使用bidi,但到目前为止我发现它在服务器端很艰难...我通过覆盖原因得到了一个线索,即为什么true不工作是通过覆盖使用我自己版本的Resources定义输出了输入,并看到:remainder为空。

+0

谢谢你看看这个问题。我现在注意到我的代码甚至不能用于开发/处理程序,或者至少不一致。我想我现在会转换成compojure。我也对为什么我的(文件响应)和(资源响应)让我的浏览器下载响应而不是在浏览器中加载它们感到困惑。 – bbs

+1

是的,可悲的是没有太多的例子可以遵循......悲伤,因为它似乎是一个伟大的想法,但使它在真实情况下工作是艰难的。浏览器下载文件通常表示未设置内容类型标题(因为缺少中间件或处理程序未返回响应)。 –