java - Twitter 抄写员和 clojure "The access_token method must be called with a request_token"

标签 java twitter clojure oauth-2.0 scribe

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

我正在将 scribe 与 clojure 一起使用,我发现使用 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”“验证程序代码”)时,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>

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

最佳答案

这是 Twitter OAuth 的工作原理(我使用 Twitter4j 实现的,原理对你来说应该是一样的):

  • 您询问RequestToken:

RequestToken requestToken = twitter.getOAuthRequestToken();

  • 由此,您将获得 2 个对象:一个 token 和一个 tokenSecret:

String token = requestToken.getToken(); String secretToken = requestToken.getTokenSecret();

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

  • 通过这 2 个参数,您可以请求 AccessToken:

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

requestToken 是根据之前的 token 重建的,secretToken 保存在某处

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

credentials.token = accessToken.getToken();

credentials.secret = accessToken.getTokenSecret();

我将此对象保存在数据库中,并在以后调用 Twitter 时重用它。 当我不能很好地理解所有这些标记时,我遇到了与您相同的错误。

尝试按照此步骤操作,应该会起作用。

关于java - Twitter 抄写员和 clojure "The access_token method must be called with a request_token",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13712871/

相关文章:

java - 如何在 dsl 查询/java 高级休息客户端查询中包含 kql

java正则表达式行

java - 创建文件和目录无法正常工作

facebook - 单个包允许通过多个社交网络使用 oauth 登录?

html - 自定义 Twitter、G+、Facebook 按钮

Clojure,使用递归在 Okasaki trie 中关联

java - 从java调用clojure

java - 在 Java 中使用 selenium webdriver 更改用户代理

javascript - 简单的 jQuery $.get 调用 twitter 失败

clojure - 如何获得一个持久的本地datomic数据库?