Обновление статуса Twitter API всегда возвращает «Неверная подпись» - PullRequest
2 голосов
/ 06 октября 2010

Я использую 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 Ответ

2 голосов
/ 06 октября 2010

Я смог решить это сам.Проблема заключалась в том, что я не устанавливал заголовок 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"));
...