2016-03-08 103 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

是的,可悲的是沒有太多的例子可以遵循......悲傷,因爲它似乎是一個偉大的想法,但使它在真實情況下工作是艱難的。瀏覽器下載文件通常表示未設置內容類型標題(因爲缺少中間件或處理程序未返回響應)。 –