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"}
.
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
pourquoi ne pas utiliser Twitter4J? – Bozho
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