代码之家  ›  专栏  ›  技术社区  ›  hleinone

Twitter API状态更新总是返回“不正确的签名”

  •  2
  • hleinone  · 技术社区  · 14 年前

    我在用 Signpost 作为OAuth实现,用于发布到Twitter。并实现了 GoogleAppEngineOAuthConsumer GoogleAppEngineOAuthProvider 类,但由于它们很琐碎,所以我现在不提供它们的源代码。

    这是我的身份验证部分,看起来工作得很好。

    LoginServlet.java:

    // fetching the request token
    OAuthConsumer consumer = new GoogleAppEngineOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
    OAuthProvider provider = new GoogleAppEngineOAuthProvider(REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, AUTHORIZATION_URL);
    String redirectUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
    // cache the request token and request token secret
    response.sendRedirect(redirectUrl);
    

    CallbackServlet.java

    // fetching the access token
    String verifier = (String) req.getParameter("oauth_verifier");
    // retrieve request token and request token secret from cache
    OAuthConsumer consumer = new GoogleAppEngineOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
    OAuthProvider provider = new GoogleAppEngineOAuthProvider(REQUEST_TOKEN_URL, 
    consumer.setTokenWithSecret(token, tokenSecret);
    provider.setOAuth10a(true);
    provider.retrieveAccessToken(consumer, verifier);
    // store access token and access token secret
    

    这是真正有问题的部分。

    TweetServlet.java

    OAuthConsumer consumer = new GoogleAppEngineOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
    // retrieve access token and access token secret from storage
    consumer.setTokenWithSecret(accessToken, accessTokenSecret);
    final HTTPRequest updateStatus = new HTTPRequest(new URL("http://api.twitter.com/1/statuses/update.json"), HTTPMethod.POST);
    updateStatus.setPayload(("status=" + URLEncoder.encode(message, "UTF-8")).getBytes());
    consumer.sign(updateStatus);
    logger.debug(new String(URLFetchServiceFactory.getURLFetchService().fetch(updateStatus).getContent()));
    

    每次结果: {"request":"/1/statuses/update.json","error":"Incorrect signature"} .

    1 回复  |  直到 14 年前
        1
  •  2
  •   hleinone    14 年前

    我能自己解决这个问题。问题是我没有设置 Content-Type 请求的头,因此签名没有对参数进行签名,从而导致签名无效。一旦我设定了 application/x-www-form-urlencoded 它开始工作了。

    final HTTPRequest updateStatus = new HTTPRequest(new URL("http://api.twitter.com/1/statuses/update.json"), HTTPMethod.POST);
    updateStatus.addHeader(new HTTPHeader("Content-Type", "application/x-www-form-urlencoded"));