2016-03-08 16 views
2

Как использовать друга и 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) 
        )) 

Это работает на «/» маршрут, но я хотел бы, чтобы убедиться, что некоторые ресурсы не могут быть достигнуты без Authoring для первого.

Это представляется возможным с friend/wrap-authorize функции:

Моя ближайшая попытка работает на AUTH завернутые маршрутов, но не совпадает на NON/Дев/маршрутам:

(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 'соответствует.

Как я могу сопоставить маршруты non/dev/* с государственными ресурсами?

ответ

2

Основная проблема здесь состоит в том, что маршрут ресурс должен быть

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

пустая строка вместо true.

В документации указывается: после согласования шаблона оставшаяся часть пути добавляется к данному префиксу.

Но, честно говоря, я считаю это довольно удивительным поведением.

Я сделал минимальный пример проекта здесь успешно маршруты /index.html https://github.com/timothypratley/bidi-resources

Следует отметить, что с просьбой /index.html2 результаты в виде исключения, что опять-таки не то, что я ожидал вообще. Я ожидал 404. o_O

Мне очень нравится биди в ClojureScript, но до сих пор я нахожу его жестким словом на стороне сервера ... Как я понял, почему true не работает, переписывая определение ресурсов с моей собственной версией, в которой были напечатаны входные данные, и увидел, что :remainder пуст.

+0

Спасибо, что посмотрели на проблему. Теперь я замечаю, что мой код даже не работает для dev/handler, или, по крайней мере, не последовательно. Я думаю, что сейчас переключусь на compojure. Также путают, почему мой (файл-ответ) и (ресурс-ответ) заставляют мой браузер загружать ответы вместо загрузки их в браузере. – bbs

+1

Yup, к сожалению, примеров не так много ... Грустно, потому что это похоже на отличную идею, но заставить ее работать в реальных ситуациях сложно. Файл загрузки браузера обычно является признаком того, что заголовок типа контента не установлен (из-за отсутствия промежуточного программного обеспечения или обработчика, не возвращающего ответ). –