07

mai
2012

On ne présente plus Twitter, service de microblogage qui, à l’instar de Facebook, est de plus en plus présent dans les applications mobiles afin de partager des informations avec son réseau social. Son intégration dans nos applications est donc une tâche récurrente que je me propose de décrire. Dans cet article, je m’intéresse à son intégration dans une application Android.

Étape préliminaire : déclarer son application sur Twitter

L’objectif de cette étape est de récupérer les consumer key et consumer secret indispensables à l’authentification de l’application Android. Pour cela, il faut en premier lieu déclarer son application auprès de Twitter. Très important : l’Application Type doit être défini à Browser, ce qui implique de spécifier une URL de retour (Callback URL) valide (n’importe quelle URL valide fera l’affaire, celle-ci pouvant ensuite être modifiée dans l’implémentation), et Twitter doit être utilisé pour l’authentification (la case Use Twitter for login doit nécessairement être cochée). Notez les valeurs de consumer key et consumer secret pour les utiliser dans votre application.

Première étape : récupérer la librairie OAuth

OAuth est un protocole libre qui permet l’authentification à une API sécurisée d’une façon simple et standard. Une implémentation Java d’OAuth est disponible à cette URL. Dans l’onglet Downloads, récupérez les dernières versions de signpost-core.jar et signpost-commonshttp.jar. Ajoutez ces deux fichiers au répertoire libs de votre application Android puis référencez les en tant que librairies dans les propriétés de votre projet. L’utilisation d’OAuth dans votre application requiert évidemment la permission d’accéder à Internet : pensez à ajouter cette permission dans votre Manifest :

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Deuxième étape : créer les objets communs

CommonsHttpOAuthConsumer mConsumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
OAuthProvider mProvider = new CommonsHttpOAuthProvider("http://twitter.com/oauth/request_token", "http://twitter.com/oauth/access_token", "http://twitter.com/oauth/authorize");
mProvider.setOAuth10a(true);

Troisième étape : autoriser l’application

La première chose à faire est de récupérer l’URL qui permettra à l’utilisateur de s’authentifier puis d’autoriser l’application :

String authUrl = mProvider.retrieveRequestToken(mConsumer, CALLBACK_URL);

Une fois cette URL récupérée, il faut présenter à l’utilisateur la page web correspondante. La solution la plus simple consiste à présenter une WebView en utilisant startActivityForResult. La page web affichée demande à l’utilisateur de s’identifier puis d’autoriser l’application. L’URL de retour est appelée  si ces deux étapes sont réussies. Il faut donc intercepter cette URL pour rediriger l’utilisateur vers l’application. Une implémentation possible est donnée ci-dessous :

mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    if (url.startsWith(CALLBACK_URL)) {
        Intent data = new Intent();
        data.setData(Uri.parse(url));
        setResult(RESULT_OK, data);
        finish();
    }
}
...
}

Quatrième étape : récupérer les éléments d’authentification

De retour dans l’application, il faut récupérer le token et le token_secret :

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Uri uri = data.getData(); String authToken = uri.getQueryParameter(OAuth.OAUTH_TOKEN);
        String authVerifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
        Assert.assertEquals(authToken, mConsumer.getToken());

        // retrieveAccessToken renseigne les éléments token et token_secret de l'objet mConsumer
        mProvider.retrieveAccessToken(mConsumer, authVerifier);
        // Ces deux éléments sont désormais accessibles via les méthodes getToken() et getTokenSecret()
    }
}

Ici, il convient de sauvegarder les éléments token et token_secret pour ne pas les redemander ultérieurement (et ainsi sauter la troisième étape intégralement). En effet, d’après Twitter, ces deux éléments n’expirent pas tant que l’utilisateur ne les révoque pas.

Cinquième étape : poster un message sur Twitter

L’ultime étape consiste à poster un message sur Twitter :

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://twitter.com/statuses/update.json");
final List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
parameters.add(new BasicNameValuePair("status", status));
post.setEntity(new UrlEncodedFormEntity(parameters, HTTP.UTF_8));
post.getParams().setBooleanParameter("http.protocol.expect-continue", false);
mConsumer.sign(post);
HttpResponse response = client.execute(post);
int status = response.getStatusLine().getStatusCode();
String reason = response.getStatusLine().getReasonPhrase();
response.getEntity().consumeContent();
if (status != 200) Log.e("Status update failed", reason);

Et voilà ! Si tout s’est bien passé, votre message apparaîtra sur la page Twitter de votre utilisateur. A vous de jouer !

Vincent

Les commentaires sont désormais fermés pour cet article

SUIVEZ-NOUS