针对不同URL的不同朋友工作流程

时间:2014-09-30 10:48:56

标签: clojure oauth-2.0 friend

我正在构建一个网络应用程序,该应用程序将使用标准用户名/密码对对用户进行身份验证,但还需要授权访问Dropbox和/或Google Drive以进行一些后台文件处理。

我正在使用friend来记录用户。我想使用friend-oauth2,但我不知道如何为不同的网址设置不同的friend工作流程。

我想要的是:

  1. /users/*workflows/interactive-form
  2. 保护
  3. /dropbox/*/gdrive/*oauth2/workflow
  4. 保护
  5. 任何其他公开网址
  6. 我知道如何做第1点和第3点(使用friend/authenticatefriend/authorize),但我不知道如何获得#2。请帮忙。

1 个答案:

答案 0 :(得分:2)

您需要使用不同的中间件定义分别包装路由。以下是使用compojure进行路径定义的示例:

(defroutes interactive-routes*
  ; Put your interactive routes here
  ; ...
  )
(defroutes oauth-routes*
  ; Put your oauth routes here
  ; ...
  )

(def interactive-routes
  (-> #'interactive-routes*
    (friend/authenticate {:credential-fn (partial creds/bcrypt-credential-fn users)
                          :workflows [(workflows/interactive-form)]})
  ))
(def oauth-routes
  (-> #'oauth-routes*
    (friend/authenticate {:credential-fn (partial creds/bcrypt-credential-fn users)
                          :workflows [(oauth2/workflow)]})
  ))

(defroutes all-routes
  (ANY "*" [] interactive-routes)
  (ANY "*" [] oauth-routes)

; Then do what you normally would with `all-routes` (e.g., wrap with more middleware, pass to ring server)

(感谢this answer关于不同路由的不同中间件的注释)