Оборачивание обработчиков ресурсов с помощью 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 был пуст.

Другие вопросы по тегам