朋友身份验证空param

时间:2014-01-17 15:12:13

标签: clojure compojure ring hiccup

我正在尝试在我的网络应用上实现朋友身份验证但是当我尝试登录时我得到这个* /登录?& login_failed = Y& username = * ...我的参数是空的,我无法登录,是什么我做错了吗?

这些是我的路线......

(defroutes routes

(GET "/" [] (index))
(GET "/indexMessage" [] (indexMessage))
(GET "/login" req (index))

(POST "/insert-user" {params :params}
   (let [firstname (get params "firstname")
         lastname (get params "lastname")
         email (get params "email")
         password (get params "password")
         sex (get params "sex")
         year (get params "year")
         month (get params "month")
         day (get params "day")]
     (def date (str year"-"month"-"day))
     (insert-user firstname lastname email password sex date)))

(route/resources "/public")
(route/not-found "Page not found")
)

我使用了所有需要的中间件......

(def page (handler/site
        (friend/authenticate
          routes
          {:allow-anon? true
           :login-uri "/login"
           :default-landing-uri "/"
           :unauthorized-handler #(-> (html5 [:h2 "You do not have sufficient privileges to access " (:uri %)])
                                    resp/response
                                    (resp/status 401))
           :credential-fn #(creds/bcrypt-credential-fn @users %)
           :workflows [(workflows/interactive-form)]})
           (wrap-keyword-params routes)
           (wrap-nested-params routes)
           (wrap-params routes)
           (wrap-session routes)


        ))

这就是我启动码头服务器的方式......

(defn -main []
(run-jetty page {:port 8080 :join? false}))

用户是这样的地图......

 {"username" {:username "username" :password "password"}}

是:角色必须在地图中?也许是因为那个?

1 个答案:

答案 0 :(得分:1)

我对Friend也很新,但是从Friend源代码我可以说POST请求的参数名称很重要。我想你正在关注这个例子,如果没有,这是你可以得到的最好的提示。注意表单字段的名称

https://github.com/cemerick/friend-demo/blob/master/src/clj/cemerick/friend_demo/interactive_form.clj#L22-l24

所有凭据函数都采用单个参数,即包含可用凭据的映射,因此  因为没有明确的POST“/ login”路由,所以Friend midleware正在捕获并使用它们作为凭证-fn的凭据,如此处所示https://github.com/cemerick/friend/blob/master/src/cemerick/friend/workflows.clj#L76-78

所以“用户名”和“密码”应该是POST到以下地址的参数的名称:login-uri

对于新手来说,这个例子可以在这里运行http://friend-demo.herokuapp.com/interactive-form/