Cemerick Friend&单页应用

时间:2014-07-23 02:19:59

标签: angularjs clojure friend

我正在使用angular和clojure构建单页面应用程序。目前,用户通过html模板中的表单提供和提交其凭证来注册其帐户并登录。然后,Clojure检查其密码是否与数据库中的加密副本匹配,并返回包含其用户名,名字/姓氏,角色和一些其他信息的json对象。整个前端是有角度的,因此,有一条主要路线:

(defroutes main
  (GET "/" [] (layout/master)))

应用程序发出各种请求来为其他功能提供服务路径:

(defroutes service
  (GET "/api/private" {params :params} (http/json-response 200 {:success true :message "it worked"}))
  (GET "/api/even-privater" {params :params} (http/json-response 200 {:success true :message "it really worked"})))

目前,这些路线没有安全措施。我想要的是使用friend/authenticate来保护这些服务路线,但是,我似乎无法找到适合我的工作流程,也无法找到有关在单页应用程序中使用cemerick / friend的任何文档。

理想情况下,用户可以登录,然后能够向安全路由发出请求。如果他们未经过身份验证,他们只会收到401回复。成功登录后,用户将收到带有一些相关用户信息的http 200。

我已经彻底阅读了workflows代码this stackoverflow post以及this issue solution,但仍然无法理解我需要做的事情。发现的演示here帮助我了解朋友可以做什么,但我发现很难应用我从他们那里学到的东西。

理想情况下,我想将应用程序放在一起:

(def secured-service
  (friend/authenticate
   routes/service
   {:credential-fn a-credential-function
    :unauthenticated-handler {:status 401 :body "Unauthenticated"}
    :workflows [(workflows/a-spa-workflow)]}))

(def app (middleware/app-handler
                  [routes/main routes/public secured-service routes/app]
                  :middleware []
                  :formats [:json-kw :edn]))

使用make-auth

的路由处理身份验证
(defroutes public
  (POST "/api/login" {params :params} (workflows/make-auth user-record ...)))

是否有人知道有关此问题的一些文档可以帮助我?或者,更好的是,有关如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:2)

我设法使用friend json workflow解决了我自己的问题。我的代码最终看起来像这样:

(def api-handler
  (-> routes/api
      wrap-keyword-params
      wrap-nested-params
      wrap-params))

(def app
  (middleware/app-handler
   [routes/main routes/public routes/api routes/app]
   :middleware []
   :formats [:json-kw :edn]))

(def secure-app
  (-> app
      (friend/authenticate {:login-uri "/api/session"
                            :unauthorized-handler json-auth/unauthorized-handler
                            :workflows [(json-auth/json-login
                                         :login-uri "/api/session"
                                         :login-failure-handler json-auth/login-failed
                                         :credential-fn (partial creds/bcrypt-credential-fn session/get-user))]})
      (ring-session/wrap-session)))

我的路线(routes/mainroutes/publicroutes/apiroutes/app)位于:

(defroutes main
  (GET "/" [] (layout/master)))

(defroutes public
  (GET "/api/session" [] json-auth/handle-session)
  (POST "/api/session" {params :params} json-auth/handle-session)
  (DELETE "/api/session" [] json-auth/handle-session)
  (POST "/api/register" {params :params} (auth/register (:credentials params) (:name params))))

(defroutes api
  (GET "/api/private" {params :params} 
       (friend/authenticated (http/json-response 200 {:success true :message "it worked"})))
  (GET "/api/even-privater" {params :params} 
       (friend/authenticated (http/json-response 200 {:success true :message "it really worked"}))))

(defroutes app
  (route/resources "/")
  (route/not-found "Not Found"))

我现在通过POST对/ api / session进行身份验证,通过DELETE注销到/ api / session,并通过GET将当前会话转到/ api / session。