Cemerick Friend 互动表单 - 无法识别 body
Cemerick Friend Interactive Form - Unrecognized body
我正在尝试使用 Cemerick Friend 的交互式表单工作流程进行身份验证。当我 post 我的 login-uri:
时出现以下错误
2015-01-13 12:51:22.945:WARN:oejs.AbstractHttpConnection:/api/login
java.lang.Exception: Unrecognized body: {:error "Wrong credentials", :uri {:ssl-client-cert nil, :remote-addr "0:0:0:0:0:0:0:1", :params {}, :headers {"origin" "http://localhost:3000", "host" "localhost:3000", "user-agent" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60", "content-type" "application/json", "content-length" "42", "referer" "http://localhost:3000/?username=friend&password=clojure", "connection" "keep-alive", "accept" "*/*", "accept-language" "en-US,en;q=0.8", "accept-encoding" "gzip, deflate, lzma", "dnt" "1"}, :server-port 3000, :content-length 42, :form-params {}, :query-params {}, :content-type "application/json", :character-encoding nil, :uri "/api/login", :server-name "localhost", :query-string nil, :body #<HttpInput org.eclipse.jetty.server.HttpInput@1edd9ed>, :scheme :http, :cemerick.friend/auth-config {:login-failure-handler #<handler$fn__5557 evertask.core.handler$fn__5557@39741646>, :unauthorized-handler #<handler$fn__5555 evertask.core.handler$fn__5555@69677f38>, :allow-anon? true, :unauthenticated-handler #<handler$fn__5553 evertask.core.handler$fn__5553@13eecd31>, :redirect-on-auth? false, :default-landing-uri "/", :login-uri "/api/login", :credential-fn #<handler$fn__5551 evertask.core.handler$fn__5551@77e17b33>, :workflows [#<workflows$interactive_form$fn__5175 cemerick.friend.workflows$interactive_form$fn__5175@745f8ec1>]}, :request-method :post}}
我的处理程序和相关代码:
(ns myproject.core.handler
(:require [compojure.handler :as ch]
[ring.middleware.json :as rj]
[ring.util.response :as rr]
[cemerick.friend :as friend]
(cemerick.friend [workflows :as workflows]
[credentials :as creds])
[myproject.core.route :as routes]))
(def users {"friend" {:username "friend"
:password (creds/hash-bcrypt "clojure")}})
(def friend-options {:allow-anon? true
:redirect-on-auth? false
:login-failure-handler #(-> (rr/response {:error "Wrong credentials" :uri %}) (rr/status 401))
:unauthenticated-handler #(-> (rr/response {:error "Unauthenticated" :uri %}) (rr/status 401))
:login-uri "/api/login"
:default-landing-uri "/"
:unauthorized-handler #(-> (rr/response {:error "Unauthorized" :uri %}) (rr/status 401))
:credential-fn #(creds/bcrypt-credential-fn users %)
:workflows [(workflows/interactive-form :redirect-on-auth? false)]})
(def secured-app
(-> (ch/api routes/api)
(rj/wrap-json-body :keywords? true)
(rj/wrap-json-response)
(friend/authenticate friend-options)))
触发登录的 ClojureScript:
(ns myproject.services.auth
(:require-macros [cljs.core.async.macros :refer [go]])
(:require [cljs-http.client :as http]
[cljs.core.async :refer [<! >! chan put!]]
[myproject.core.store :as store]))
(defn login [res username password]
(go (let [result (<! (http/post "/api/login" {:json-params {:username username :password password}}))]
(.log js/console (pr-str result))
(if (= (:status result) 200)
(let [access (:body result)]
(swap! store/app-state assoc :access access)
(swap! store/app-state assoc :view :tasks)
(>! res true))
(>! res false)))))
(defn active-access [res]
(go (let [access (<! (http/get "/api/session"))]
(if (= (:status access) 200)
(>! res (:body access))
(>! res false)))))
有什么想法吗?
原来问题是我的中间件的顺序。我需要 wrap-json-body
after friend-authenticate
.
我正在尝试使用 Cemerick Friend 的交互式表单工作流程进行身份验证。当我 post 我的 login-uri:
时出现以下错误2015-01-13 12:51:22.945:WARN:oejs.AbstractHttpConnection:/api/login
java.lang.Exception: Unrecognized body: {:error "Wrong credentials", :uri {:ssl-client-cert nil, :remote-addr "0:0:0:0:0:0:0:1", :params {}, :headers {"origin" "http://localhost:3000", "host" "localhost:3000", "user-agent" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60", "content-type" "application/json", "content-length" "42", "referer" "http://localhost:3000/?username=friend&password=clojure", "connection" "keep-alive", "accept" "*/*", "accept-language" "en-US,en;q=0.8", "accept-encoding" "gzip, deflate, lzma", "dnt" "1"}, :server-port 3000, :content-length 42, :form-params {}, :query-params {}, :content-type "application/json", :character-encoding nil, :uri "/api/login", :server-name "localhost", :query-string nil, :body #<HttpInput org.eclipse.jetty.server.HttpInput@1edd9ed>, :scheme :http, :cemerick.friend/auth-config {:login-failure-handler #<handler$fn__5557 evertask.core.handler$fn__5557@39741646>, :unauthorized-handler #<handler$fn__5555 evertask.core.handler$fn__5555@69677f38>, :allow-anon? true, :unauthenticated-handler #<handler$fn__5553 evertask.core.handler$fn__5553@13eecd31>, :redirect-on-auth? false, :default-landing-uri "/", :login-uri "/api/login", :credential-fn #<handler$fn__5551 evertask.core.handler$fn__5551@77e17b33>, :workflows [#<workflows$interactive_form$fn__5175 cemerick.friend.workflows$interactive_form$fn__5175@745f8ec1>]}, :request-method :post}}
我的处理程序和相关代码:
(ns myproject.core.handler
(:require [compojure.handler :as ch]
[ring.middleware.json :as rj]
[ring.util.response :as rr]
[cemerick.friend :as friend]
(cemerick.friend [workflows :as workflows]
[credentials :as creds])
[myproject.core.route :as routes]))
(def users {"friend" {:username "friend"
:password (creds/hash-bcrypt "clojure")}})
(def friend-options {:allow-anon? true
:redirect-on-auth? false
:login-failure-handler #(-> (rr/response {:error "Wrong credentials" :uri %}) (rr/status 401))
:unauthenticated-handler #(-> (rr/response {:error "Unauthenticated" :uri %}) (rr/status 401))
:login-uri "/api/login"
:default-landing-uri "/"
:unauthorized-handler #(-> (rr/response {:error "Unauthorized" :uri %}) (rr/status 401))
:credential-fn #(creds/bcrypt-credential-fn users %)
:workflows [(workflows/interactive-form :redirect-on-auth? false)]})
(def secured-app
(-> (ch/api routes/api)
(rj/wrap-json-body :keywords? true)
(rj/wrap-json-response)
(friend/authenticate friend-options)))
触发登录的 ClojureScript:
(ns myproject.services.auth
(:require-macros [cljs.core.async.macros :refer [go]])
(:require [cljs-http.client :as http]
[cljs.core.async :refer [<! >! chan put!]]
[myproject.core.store :as store]))
(defn login [res username password]
(go (let [result (<! (http/post "/api/login" {:json-params {:username username :password password}}))]
(.log js/console (pr-str result))
(if (= (:status result) 200)
(let [access (:body result)]
(swap! store/app-state assoc :access access)
(swap! store/app-state assoc :view :tasks)
(>! res true))
(>! res false)))))
(defn active-access [res]
(go (let [access (<! (http/get "/api/session"))]
(if (= (:status access) 200)
(>! res (:body access))
(>! res false)))))
有什么想法吗?
原来问题是我的中间件的顺序。我需要 wrap-json-body
after friend-authenticate
.