2010-10-05 50 views
2

我使用Signpost作爲OAuth實現發佈到Twitter。並且實現了GoogleAppEngineOAuthConsumerGoogleAppEngineOAuthProvider類,但由於它們非常微不足道,所以我沒有在這裏提供源代碼。Twitter API狀態更新始終返回「錯誤簽名」

這是我的驗證部分,這似乎工作得很好。

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

+0

我已經想通了,這可能涉及到我送參數時,由於路上,當我改變'TweetServlet'到'最後的HTTPRequest updateStatus =新的HTTPRequest(新URL(「HTTP:// API。 twitter.com/1/statuses/home_timeline.json「),HTTPMethod.GET);'它返回正確的響應。 – hleinone 2010-10-06 05:39:23

+0

爲什麼不使用Twitter4J? – Bozho 2010-10-06 06:08:00

+0

如果我沒有這個工作,這將是我的下一步。我之所以選擇不這樣做,是因爲我只使用它的一小部分,其次我可能會將其用作基於OAuth的其他服務的基礎。 – hleinone 2010-10-07 18:23:44

回答

2

我能夠自己解決這個問題。問題在於我沒有爲請求設置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"));