У меня проблемы с промежуточным ПО моего сервера Clojure. Мое приложение имеет следующие требования:
Некоторые маршруты должны быть доступны без проблем. Другие требуют базовой аутентификации, поэтому я хотел бы иметь функцию аутентификации, которая находится перед всеми функциями-обработчиками и обеспечивает проверку запроса. Для этого я использовал обработчик ring-basic-authentication, особенно инструкции по , как разделять ваши публичные и частные маршруты .
Однако я также хотел бы, чтобы параметры, отправляемые в заголовке Authorization:
, были доступны в контроллере маршрута. Для этого я использовал функцию site
Compojure в compojure.handler
, которая помещает переменные в словарь :params
запроса (см., Например, Отсутствующие параметры формы в запросе Compojure POST )
Однако я не могу получить разрешение 401 и на параметры для одновременной работы. Если я попробую это:
; this is a stripped down sample case:
(defn authenticated?
"authenticate the request"
[service-name token]
(:valid (model/valid-service-and-token service-name token)))
(defroutes token-routes
(POST "/api/:service-name/phone" request (add-phone request)))
(defroutes public-routes
controller/routes
; match anything in the static dir at resources/public
(route/resources "/"))
(defroutes authviasms-handler
public-routes
(auth/wrap-basic-authentication
controller/token-routes authenticated?))
;handler is compojure.handler
(def application (handler/site authviasms-handler))
(defn start [port]
(ring/run-jetty (var application) {:port (or port 8000) :join? false}))
переменные авторизации доступны в функции authenticated?
, но не в маршрутах.
Очевидно, это не очень общий пример, но я чувствую, что действительно крутлю свои колеса и просто произвольно меняю порядок промежуточного программного обеспечения и надеюсь, что все будет работать. Я был бы признателен за некоторую помощь как для моего конкретного примера, так и за то, чтобы узнать больше о том, как обернуть промежуточное программное обеспечение для правильной работы.
Спасибо,
Kevin