oauth - 使用 bidi 包装资源处理程序

标签 oauth clojure bidi

如何使用 friend 和 bidi 来包装资源处理程序?

我已成功让 oAuth 验证路由:

(defn auth-handler [request] (friend/authorize #{::user}
                                               {:status 200
                                                :body   "a secret"}))

(def routes ["/" {true auth-handler}])

(def app (make-handler routes))

(web/run-dmc (-> app
                   var
                   (friend/authenticate
                     {:allow-anon? true
                      :workflows   [(oauth/workflow
                                      {:client-config client-config
                                       :uri-config    uri-config
                                       :credential-fn credential-fn})]})
                   (wrap-resource "public")
                   (wrap-defaults site-defaults)
                   ))

这适用于“/”路由,但我想确保某些资源在没有先授权的情况下无法访问。

这似乎可以通过 friend/wrap-authorize 函数实现:

我最接近的尝试在 auth 包装路由上工作,但在非/dev/路由上不匹配:

(def routes ["/" [["dev/" [[true (friend/wrap-authorize (resources {:prefix "dev/"}) #{::user})]]]
                  [true (resources {:prefix "public/"})]]])


(match-route routes "/dev/index.html")
=>
{:handler #object[cemerick.friend$wrap_authorize$fn__24411
              0x2400d0be
              "cemerick.friend$wrap_authorize$fn__24411@2400d0be"]}
;correct

(match-route routes "/index.html")
=>
nil
;not correct

我认为路由模式 [true (resources {:prefix "public/"})] 的匹配部分是错误的,因为当我将其更改为 :key `index.html' 确实匹配。

如何将非/dev/* 路由匹配到公共(public)资源?

最佳答案

这里主要的问题是资源路由应该是

["" (resources {:prefix "public/"})]

空字符串而不是 true

文档确实指出:模式匹配后,路径的剩余部分将添加到给定的前缀。

但坦率地说,我认为这是非常令人惊讶的行为。

我在这里做了一个成功路由/index.html 的最小示例项目 https://github.com/timothypratley/bidi-resources

值得注意的是,请求/index.html2 会导致异常,这又完全不是我所期望的。我期待一个 404。o_O

我真的很喜欢 ClojureScript 中的 bidi,但到目前为止,我发现它在服务器端是一个艰难的过程……我了解为什么 true 不起作用的方法是覆盖用我自己的版本定义资源,打印出输入,并看到 :remainder 是空的。

关于oauth - 使用 bidi 包装资源处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35875008/

相关文章:

java - Flickr API Java/Clojure

clojure - 构建 LISP 机器需要多少原语?十、七还是五?

java - 从 windows-1256 转换为 UTF-8 会导致标点符号问题

JavaScript:如何检查字符是否为 RTL?

url - 移动设备的 OAuth 回调程序

oauth - 您可以在不获取 OAuth 凭据的情况下使用 OpenID Connect 吗?

c# - 没有调用 ICustomAuthorizeRequestValidator?

math - Clojure 中的任意精度取幂

javascript - 在阿拉伯字符串上使用替换时的奇怪行为

oauth - 在 linkedin 应用程序中哪里可以找到 Oauth token 和 secret