我正在构建一个网络应用程序,该应用程序将使用标准用户名/密码对对用户进行身份验证,但还需要授权访问Dropbox和/或Google Drive以进行一些后台文件处理。
我正在使用friend来记录用户。我想使用friend-oauth2,但我不知道如何为不同的网址设置不同的friend
工作流程。
我想要的是:
/users/*
受workflows/interactive-form
/dropbox/*
和/gdrive/*
受oauth2/workflow
我知道如何做第1点和第3点(使用friend/authenticate
和friend/authorize
),但我不知道如何获得#2。请帮忙。
答案 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关于不同路由的不同中间件的注释)