0

我正在尝试在我的网络应用程序上实现朋友身份验证,但是当我尝试登录时,我得到这个 */login?&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}))

users 是这样的地图...

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

:roles 在地图中是必须的吗?也许是因为这个?

4

1 回答 1

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 中间件正在捕获并将它们用作您的 credential-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/

于 2014-01-20T01:20:31.827 回答