:credential-fn не вызывается промежуточным программным обеспечением друга/аутентификации?

Я пытаюсь использовать Friend с Luminus (в основном lib-noir), и я обнаружил, что мой :credential-fn вообще не вызывается. Сначала я подумал, может быть, я неправильно добавил промежуточное программное обеспечение, но я попытался установить пользовательский :login-failure-handler, чтобы посмотреть, работает ли это, и это сработало.

Вот как выглядит мое приложение:

(defroutes my-routes
  (GET "/login" [login_failed username]
       (login-page login_failed username))  ;; login-page just renders HTML form
  (GET "/logout" req
       (friend/logout* (resp/redirect (str (:context req) "/")))))

(defn login-failure-handler [req]
  (println "Failed")  ;; <-- get's printed and redirects no problem
  (redirect "/login?failed=Y"))

(defn credential-fn [creds-map]
  (println creds-map)  ;; <-- doesn't get printed at all
  {:identity "test" :roles [::user]})

;; define custom wrapping middleware as noir's middleware/app-handler does
;; its own thing with routes + middleware
(defn authenticate [handler]
  (friend/authenticate
    handler
    {:workflows [(workflows/interactive-form
                   :credential-fn credential-fn
                   :login-failure-handler login-failure-handler)]}))

(defn debugger [handler]
  (fn [req]
    (println req)
    (handler req)))

(def app (middleware/app-handler
          ;; add your application routes here
          [my-routes]

          ;; add custom middleware here
          :middleware [debugger authenticate]

          ;; add access rules here
          :access-rules []

          ;; serialize/deserialize the following data formats
          ;; available formats:
          ;; :json :json-kw :yaml :yaml-kw :edn :yaml-in-html
          :formats [:json-kw :edn]))

Я также добавил промежуточное программное обеспечение debugger, которое просто распечатывает карту запроса, и я заметил, что оно вообще не печатает ничего, когда я нажимаю кнопку отправки формы входа (т.е. нет запроса POST это происходит). Он просто сразу выводит GET на login-failure-handler.

Что я упустил?


person john2x    schedule 25.01.2014    source источник


Ответы (2)


Оказывается, моя форма входа была неправильной. Друг конкретно ожидает 2 параметра формы из запроса POST, username и password. Таким образом, форма входа должна иметь эти два поля. Кажется, нет способа настроить эти поля на стороне друга, что я считаю недостатком.

person john2x    schedule 26.01.2014
comment
Это кажется распространенной ошибкой, если вы хотите просто использовать предоставленные рабочие процессы, но Боюсь, не могу с вами согласиться, это не недостаток. Вы можете легко разветвить любой рабочий процесс и настроить имена параметров, см. github.com/cemerick/friend/blob/master/src/cemerick/friend/ - person Jaime Agudo; 27.01.2014

Вам нужно передать credential-fn в friend/authenticate следующим образом:

(friend/authenticate
  handler
  {:credential-fn credential-fn
   :workflows [(workflows/interactive-form)]})
person ponzao    schedule 25.01.2014
comment
Я пробовал оба стиля. Я показал последний, так как это рекомендуемый путь из README. Тот же результат с обоими. Нужно ли добавлять POST-маршрут для /login? Хотя в документах об этом не сказано. Я добавил HTML-форму входа. - person john2x; 26.01.2014