【问题标题】:Twitter scribe and clojure "The access_token method must be called with a request_token"Twitter scribe 和 clojure “必须使用 request_token 调用 access_token 方法”
【发布时间】:2012-11-22 16:00:50
【问题描述】:

(注意如果你不懂clojure,我可以翻译Java代码,请问)

我正在使用带有 clojure 的 scribe,我发现使用 twitter 登录时遇到了一些问题,我正在使用的代码:

(def twitter-service
  (-> (doto
          (ServiceBuilder.)
        (.provider (TwitterApi$Authenticate.))
        (.apiKey "apikey")
        (.apiSecret "apisecret")
        (.callback "https://morgan-siscia.rhcloud.com/tatata/"))
      (.build)))

(def tokens (atom {}))

(defn get-token []
  (.getRequestToken twitter-service))

(defn get-twitter-url [token]
  (swap! tokens assoc (.getToken token) token)
  (.getAuthorizationUrl twitter-service token))

(defn get-info-twitter [oauth-token oauth-veri]
  (let [token (get @tokens oauth-token)
        verifier (Verifier. oauth-veri)
        access-token (.getAccessToken twitter-service token verifier)
        request (doto (OAuthRequest. (Verb/POST)
                                     "https://api.twitter.com/oauth/access_token")
                  (.addOAuthParameter "oauth_token" oauth-token)
                  (.addBodyParameter "oauth_verifier" oauth-veri))]
    (do
      (.signRequest twitter-service access-token request)
      (swap! tokens dissoc oauth-token))
    (.getBody (.send request))))

该代码是 java 代码的直接翻译,但是它不起作用。

当我调用 (get-info-twitter "the-oauth-code" "the verifier code") twitter 返回错误:

<?xml version="1.0" encoding="UTF-8"?>
<hash>
  <request>/oauth/access_token</request>
  <error>The access_token method must be called with a request_token</error>
</hash>

老实说,我不知道我做错了什么,有人可以帮助我吗?

【问题讨论】:

    标签: java twitter clojure oauth-2.0 scribe


    【解决方案1】:

    以下是 Twitter OAuth 的工作原理(我使用 Twitter4j 进行,原理应该与您相同):

    • 你问一个RequestToken

    RequestToken requestToken = twitter.getOAuthRequestToken();

    • 从中,您得到 2 个对象:一个 token 和一个 tokenSecret

    字符串令牌 = requestToken.getToken(); String secretToken = requestToken.getTokenSecret();

    • 用户正在授权您的应用程序,并且 Twitter 调用 回调 URL,向您传递 2 个参数:oauth_tokenoauth_verifier

    • 通过这两个参数,你可以问一个AccessToken

    AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, oauth_verifier);

    requestToken 是从以前的令牌重建的,secretToken 保存在某处

    • 这个新对象包含 2 个字符串,您必须保留以备将来调用 Twitter 时使用:

    credentials.token = accessToken.getToken();

    credentials.secret = accessToken.getTokenSecret();

    我将此对象保存在数据库中,并在以后调用 Twitter 时重用它。 当我没有很好地理解所有这些标记时,我遇到了和你一样的错误。

    试着按照这个一步一步来,它应该可以工作。

    【讨论】:

    • 这里已经很晚了,但多亏了你,我应该得到我的错误......我明天早上会检查......无论如何谢谢:-)
    • 我做的太多了,我正在获取访问令牌并尝试使用错误的令牌访问其他资源...抄写员文档不太清楚...
    • 很好的解释,我写了一些代码并且它工作了,直到有一天它停止并且不再工作了。在数据库中,我保存了 credentials.token 和 credentials.secret,现在要更新用户的 Twitter 状态,我按照RequestToken requestToken = new RequestToken(user.getTwittertoken(), user.getTwittersecret()); AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, user.getTwittersecret()); 的方式执行操作,我收到 401 - 必须使用 request_token 调用 access_token 方法。你能帮忙吗?或分享您稍后更新的代码。
    【解决方案2】:

    你为什么不使用 clojure-twitter 呢?会更干净。

    例子:

    (:require twitter [oauth.client :as oauth])
    
     ;; Make a OAuth consumer
     (def oauth-consumer (oauth/make-consumer 
                          twitter-key
                          twitter-secret
                          "https://api.twitter.com/oauth/request_token"
                          "https://api.twitter.com/oauth/access_token"
                          "https://api.twitter.com/oauth/authorize"
                          :hmac-sha1))
    

    然后:

    (twitter/with-oauth oauth-consumer
         oauth-access-token
         oauth-access-token-secret
         (print (twitter/user-timeline :screen-name username)))
    

    https://github.com/mattrepl/clojure-twitter

    【讨论】:

    • 是的,但我需要一些东西用于 facebook,然后用于 G+...
    【解决方案3】:

    oauth_verifier 参数出现在回调中。使用那个

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 2017-04-27
      相关资源
      最近更新 更多