【问题标题】:How to wrap oAuth headers in clj-http?如何在 clj-http 中包装 oAuth 标头?
【发布时间】:2015-05-15 15:26:32
【问题描述】:

我正在尝试使用 clojure 发布 Twitter 状态更新...但这可能确实是关于 oAuth 标头的问题,并通过出色的 clj-http 库使用它。

我之前使用过 clj-http 来处理 basic-auth 和其他类型的标头,它相当简单。 Authorization: Bearer ... 有点令人困惑,但我最终到达了那里。

不过,对于 twitter,我应该在 Authorization 中传递很多变量,但我不太确定该怎么做。根据 twitter,这是我需要发布推文的 curl 命令:

curl --request 'POST' 'https://api.twitter.com/1.1/statuses/update.json' 
     --data 'status=this+is+sparta' 
     --header 'Authorization: OAuth oauth_consumer_key="xxxxx",
                              oauth_nonce="xxxxx", 
                              oauth_signature="xxxxx", 
                              oauth_token="xxxxx", oauth_version="1.0"' 
     --verbose

所以我不确定如何在标题中附加所有 oAuth... 内容。尝试(str ..) 并没有真正奏效。这是我到目前为止所得到的:

(client/post "https://api.twitter.com/1.1/statuses/update.json")
             {:headers {:Authorization (str "OAuth oauth_consumer_key='xxxxx', oauth_nonce='xxxxx', oauth_signature='xxxxx', oauth_token='xxxxx', oauth_version='1.0'" )}
              :form-params {:status "This is sparta"})

我尝试时返回 403. 权限错误。

关于如何构建该查询的任何想法?

ps:我确实有帐户的 oAuth tokentoken_secret...但我注意到 token_secret 值没有被传递? oauth_nonce 有什么用?我现在正在传递 twitter 给我的 curl 值……环顾四周,它似乎只是一个随机值,所以不要大惊小怪。

【问题讨论】:

  • 单引号和双引号可能很重要。尝试在标题中用 \" 替换 '
  • 我过去在尝试使用 clj-oauth 时遇到过困难(主要是因为我自己对 clojure 的理解),但我发现 twitter-api 使用起来非常简单:github.com/adamwynne/twitter-api - 它可以使用内部也是 clj-oauth。
  • @iamserious 您建议的库终于起作用了,我可以看到源代码来解决我想要的结果,但最终使用了库本身..您想将其作为答案提交以便我接受吗?
  • 哈!如果我考虑过“我正在尝试使用 clojure 发布推特状态更新......”部分,这可能会触发相同的答案:-)

标签: oauth clojure twitter-oauth clj-http


【解决方案1】:

可能值得看看 Matt Revelle 的 Clojure 的 OAuth 客户端库。 https://github.com/mattrepl/clj-oauth

OAuth 非常重要,以至于将一些简单的东西拼凑在一起变得很烦人。如果没有别的,你仍然想走最小的路线,你可能会得到一些想法。

【讨论】:

  • clj-oauth 甚至在其首页上有一个如何访问 twitter 的示例。
  • 嗨皮特,我刚刚尝试使用 clj-oauth,就像在 repo 上的示例一样,我定义了一个消费者,定义了凭据并使用 (http/post url {:query-params credentials}) 发布但我得到了 403 @987654323 @从推特回来。我注意到该示例不包含我的应用程序密钥,因此我将它们添加到 POST 的标题中,这绝对不起作用(you don't have that permission 响应)。凭据在 :query-params 中传递,这对我来说看起来不正确……有什么想法吗?
  • 您可以试试 clj-oauth README 的运行测试部分吗?
【解决方案2】:

过去我在尝试使用 clj-oauth 时遇到过困难(主要是因为我自己对 clojure 的理解),但我发现 twitter-api 使用起来非常简单。它在内部使用了 clj-oauth。

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多