Application-only authentication con Twitter4j

Standard

Twitter nos ofrece la posibilidad de realizar peticiones contra su API en nombre de la aplicación en sí, sin necesidad de pedir al usuario que se loguee en su cuenta de Twitter, es lo que se llama Application-only authentication.

¿Cómo funciona? El proceso sigue el siguiente flujo:

1) La aplicación, que ha obtenido su CONSUMER_KEY y su CONSUMER_SECRET (Ver Post anterior), los añade a su set de credenciales para realizar luego la petición.

2) Se realiza la petición de obtener un bearer Token contra POST oauth/token.

3) Con este token se realizarán solicitudes contra la API de Twitter en nombre de la aplicación, como búsquedas, etc.

Usar este tipo de autenticación tiene unas limitaciones, como es obvio, porque por ejemplo no podremos enviar mensajes directos en nombre de ningún usuario ya que no se ha pedido ningún tipo de login de usuario de Twitter.

Además Twitter impone un límite de peticiones por franjas de 15 minutos. Todas estas limitaciones se pueden consultar aquí. Sólo las funcionalidades que tienen un valor en la columna de la derecha pueden ser usadas a través de Application-only authentication.

Una vez vista esta introducción, veamos como podemos implementarlo en nuestra aplicación Android. Para ello vamos a usar la librería Twitter4j, que nos facilita la integración con Twitter.

Para poder usar Application-only authentication (a día de hoy) deberemos usar el último snapshot que tienen twitter4j-3.0.4-SNAPSHOT, ya que han introducido el soporte a esta autenticación recientemente. Del zip que se descarga nos quedaremos con la librería core, twitter4j-core-3.0.4-SNAPSHOT.jar y la añadiremos a nuestro buildpath del proyecto Android.

Siguiendo los pasos citados arriba, primero debemos preparar nuestro credenciales:

 private ConfigurationBuilder builder;
 private Twitter twitter;
 private TwitterFactory factory;
@Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   requestWindowFeature(Window.FEATURE_NO_TITLE);
   setContentView(R.layout.init_act_layout);
   // setup
   builder = new ConfigurationBuilder();
   builder.setUseSSL(true);
   builder.setApplicationOnlyAuthEnabled(true);
   builder.setOAuthConsumerKey(Constants.CONSUMER_KEY);
   builder.setOAuthConsumerSecret(Constants.CONSUMER_SECRET);
   Configuration configuration = builder.build();
   factory = new TwitterFactory(configuration);

Ya tenemos preparada la configuración, podemos obtener el bearer token. Como se trata de una operación “network” debemos realizarla fuera del hilo principal (UIthread), por lo que vamos a crear una clase que extienda de AsyncTask y en el método doInBackground:

@Override
 protected OAuth2Token doInBackground(Void... params) {
 OAuth2Token bearerToken = null;
 try {
  bearerToken = twitter.getOAuth2Token();
 } catch (TwitterException e) {
    e.printStackTrace();
 }
  return bearerToken;
 }

Deberemos invocarla desde el hilo principal con execute().

Una vez obtenido el bearer token lo podremos usar para realizar peticiones a Twitter, como por ejemplo una búsqueda: (tendríamos que realizar las peticiones también fuera del hilo principal)

@Override
 protected QueryResult doInBackground(Void... params) {

 twitter.setOAuth2Token(bearerToken);
 Query query = new Query();
 [...]
 result = twitter.search(query);

Twitter4j también nos proporciona un ejemplo en GitHub

Espero que te haya sido útil

😉

Advertisements