2010-10-05 3 views
2

J'utilise Signpost comme implémentation OAuth pour publier sur Twitter. Et implémenté les classes GoogleAppEngineOAuthConsumer et GoogleAppEngineOAuthProvider, mais comme elles sont plutôt triviales, je ne fournis pas (encore) leurs sources ici.La mise à jour de l'état de l'API Twitter renvoie toujours "Signature incorrecte"

Voici ma partie authentification, qui semble fonctionner correctement.

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 

Et voici la partie problématique réelle.

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())); 

Chaque fois qu'il en résulte: {"request":"/1/statuses/update.json","error":"Incorrect signature"}.

+0

J'ai compris que cela pourrait se rapporter à la façon dont j'envoie les paramètres, car lorsque je change la '' finale TweetServlet' à HTTPRequest updateStatus = new HTTPRequest (nouvelle URL ("http: // api. twitter.com/1/statuses/home_timeline.json "), HTTPMethod.GET);' il renvoie une réponse correcte. – hleinone

+0

pourquoi ne pas utiliser Twitter4J? – Bozho

+0

Cela aurait été ma prochaine prise si je n'avais pas eu ce travail. J'ai choisi de ne pas le faire en premier lieu, puisque je n'utiliserais qu'un petit sous-ensemble de celui-ci et deuxièmement que je pourrais l'utiliser comme base pour d'autres services basés sur OAuth. – hleinone

Répondre

2

J'ai été capable de résoudre ce problème par moi-même. Le problème était que je ne définissais pas un Content-Type en-tête à la demande, donc la signature n'a pas signé les paramètres et il en résulte la signature invalide. Une fois que je l'ai mis à application/x-www-form-urlencoded il a commencé à travailler.

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")); 
Questions connexes