Оборачивание обработчиков ресурсов с помощью 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
функция:
Моя самая близкая попытка работает на маршрутах, завернутых с помощью auth, но не совпадает с не /dev/ route:
(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 ответ
Основная проблема здесь заключается в том, что ресурсный маршрут должен быть
["" (resources {:prefix "public/"})]
Пустая строка вместо true
,
В документации действительно говорится: после сопоставления с образцом, оставшаяся часть пути добавляется к данному префиксу.
Но, честно говоря, я считаю, что это довольно удивительное поведение.
Я сделал минимальный пример проекта, который успешно маршрутизирует /index.html https://github.com/timothypratley/bidi-resources
Примечательно, что запрос /index.html2 приводит к исключению, что опять-таки совсем не то, что я ожидал. Я ожидал 404. о_О
Мне действительно нравится Bidi в ClojureScript, но до сих пор я считаю, что это сложная проблема на стороне сервера... То, как я понял, почему true
не работает, переписав определение ресурсов моей собственной версией, которая распечатала входные данные, и увидел, что :remainder
был пуст.