【问题标题】:OAuth1 in ClojureClojure 中的 OAuth1
【发布时间】:2015-08-22 13:16:53
【问题描述】:

我正在尝试使用 Clojure 与 API (Context.IO) 集成。 Context.IO 使用 OAuth 1,它需要通知消费者密钥和消费者秘密凭据以与之集成。

我过去曾使用请求库 (https://github.com/request/request) 设法将 Context.IO 与 Node.JS 一起使用。原来很简单,就是把consumer_key和consumer_secret填入一个对象,然后在请求中传入oauth参数。

var oauth   = 
{
  consumer_key: 'dsfdfssdf',
  consumer_secret: 'dasfsafdsf'
};

request.post( { url:url, oauth:oauth } )

现在我正在尝试使用 clj-oauth https://github.com/mattrepl/clj-oauth 完成相同的操作,但我有点迷茫,因为它需要的参数太不同(我猜对于更复杂的用例),而且我很难时间试图弄清楚如何做简单的事情。

要添加更多信息,Context IO 仅将 OAuth 用于 API 身份验证,而不是用户授权。因此,它不需要通知令牌,也不提供令牌。它只需要消费者密钥和签名(此处描述相同:dev.twitter.com/oauth/overview/creating-signatures)。

有人可以举一个类似于我在 Node 中使用 Clojure 或 clj-oauth(或任何其他库)完成的示例吗?我还没有找到这样做的方法。

谢谢!

【问题讨论】:

  • 我现在正在使用那个库。如果您按照自述文件进行操作,则可以使用...
  • 嗨,Red Deck,感谢您的回复。例如,make-consumer 函数接受 3 个 URL 作为参数,而我没有。我只有消费者密钥、秘密和方法 (hmac-sha1)。
  • 一般来说,网址遵循相同的模式。例如,这对我有用 Goodreads "goodreads.com/oauth/request_token" "goodreads.com/oauth/access_token" "goodreads.com/oauth/authorize"
  • 嗨 Red Deck,我已经进一步研究了这个问题,我写信是为了提供更多关于它的细节。 Context IO 场景中的 OAuth 仅用于 API 身份验证,而非用户授权。因此,在发出请求时,根本不会通知令牌。通知的唯一参数是消费者密钥和签名(这是请求的散列)。签名如下所述:dev.twitter.com/oauth/overview/creating-signatures。因此,通知额外参数似乎没有意义,而 Context 不提供这些参数。所以我仍然不知道如何使用该库:(
  • 在下面查看我的答案。

标签: rest oauth clojure


【解决方案1】:

我注册了 context io 来尝试一下。首先,在 leiningen 我设置了

:dependencies [[org.clojure/clojure "1.6.0"]
                 [clj-oauth "1.5.2"]
                 [clj-http "1.1.2"]] 

作为我的依赖项。下面有两个例子。一个调用不带任何参数的url,另一个调用相同的url,但带参数。

(ns scratch.core
  (:require [oauth.client :as oauth]
            [clj-http.client :as http]))

(def okey "key")

(def osecret "secret")

(def consumer (oauth/make-consumer okey
                                   osecret
                                   nil
                                   nil
                                   nil
                                   :hmac-sha1))

(defn test-get []
  (let [credentials (oauth/credentials consumer
                                       nil
                                       nil
                                       :GET
                                       "https://api.context.io/lite/users")]
    (http/get "https://api.context.io/lite/users" {:query-params credentials})))

(defn test-get-params []
  (let [params {:email "blah@blah.com"}
        credentials (oauth/credentials consumer
                                       nil
                                       nil
                                       :GET
                                       "https://api.context.io/lite/users"
                                       params)]
    (http/get "https://api.context.io/lite/users" {:query-params (merge credentials params)})))

【讨论】:

  • 我试图使用这个答案来配置我对 Goodreads API 的 OAuth 访问权限,以获取 XML 格式的成员朋友列表,但我似乎无法弄清楚我做错了什么。我还发布了一个关于 stackoverflow 的问题以及我目前所拥有的内容:stackoverflow.com/questions/32920728/… 任何帮助将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 2016-06-11
  • 2016-06-11
  • 2019-03-25
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多