【问题标题】:Twitter API status update always returns "Incorrect signature"Twitter API 状态更新总是返回“不正确的签名”
【发布时间】:2011-04-21 13:09:51
【问题描述】:

我使用 Signpost 作为 OAuth 实现来发布到 Twitter。并实现了 GoogleAppEngineOAuthConsumerGoogleAppEngineOAuthProvider 类,但由于它们非常简单,所以我不在这里提供它们的源代码(目前)。

这是我的身份验证部分,它似乎工作得很好。

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"}

【问题讨论】:

  • 我发现这可能与我发送参数的方式有关,因为当我将 TweetServlet 更改为 final HTTPRequest updateStatus = new HTTPRequest(new URL("http://api.twitter.com/1/statuses/home_timeline.json"), HTTPMethod.GET); 时,它会返回正确的响应。
  • 如果我没有这个工作,那将是我的下一个目标。首先,我选择不这样做,因为我只会使用其中的一小部分,其次,我可能会将其用作基于 OAuth 的其他服务的基础。

标签: java google-app-engine twitter oauth signpost


【解决方案1】:

我能够自己解决这个问题。问题是我没有为请求设置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"));

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2012-01-11
    • 1970-01-01
    • 2013-03-29
    • 2017-02-05
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多