Autentificación OAuth con Twitter4j

Tags: , , ,

El 31 de Agosto de este año (2010) twitter dejo de proveer seguridad por medio de contraseña y usuario como venia siendo habitual en muchos clientes de Twitter.

Asi que nos hemos vistos muchos, como en mi caso, obligados a migrar OAuth, al principio cuesta un poco entender como funciona, pero es realmente muy sencillo y no comprometemos las contraseñas de nuestros usuarios.

Si quieres aprender algo mas sobre el protocolo de autorizacion OAuth, por aquí.. No quiero entrar a explicar como registrar una aplicacion en twitter, porque eso lo hacen muy bien en KodeGeek con Twitter4j.

En mi caso, no es una aplicación de escritorio, es web y con Java Server Faces, no usaré servlets porque mi intencion es almacenar la información en la base de datos, y no sera una sola cuenta, podran ser muchas cuentas. Dejo este tipico ejemplo que es el mas común de encontrar y con el que vamos a empezar a aclarar un poco lo que he leido en varios blogs.

Solo presentaré extractos de código, lo mas importante para entender como registrar las autentificaciones válidas con OAuth en Twitter y poder usarlas posteriormente.

//Creamos una instancia de Twitter, usemos el TwitterFactory , trabajamos con la version de Twitter4j 2.3.1
this.twitter = new TwitterFactory().getInstance();
// Las 2 llaves que nos da Twitter al registrar la aplicacion, estas son fundamentales las
// usaremos mucho, se deben almacenar en la base de datos
this.twitter.setOAuthConsumer("consumer_key", "consumer_secret");
//Solicitamos un REQUEST TOKEN, este objeto solo se debe crear una sola vez.
this.requestToken = twitter.getOAuthRequestToken();
//Obtenemos el URL, este url lo podemos presentar en JSF con un link y nos enviara a la página
// de twitter, daremos permiso a nuestra aplicacion
// y obtendremos el pin que usaremos a continuacion.
final String url = this.requestToken.getAuthorizationURL();

Hasta aquí todo bien, tenemos nuestro RequestToken, deberian usarlo en su clase como una propiedad de la clase, lo usaremos en otro metodo, tambien el objeto Twitter lo reutilizaremos, por eso los this.

//El objeto AccessToken, este objeto lo usaremos constantemente, cada vez que querramos 
//comunicarnos con Twitter, en este caso para validar nuestro
// RequesToken y obtener 2 llaves mas, que son las definitivas y las que nos permitiran 
//publicar, hasta el momento no hemos terminado
this.accessToken = this.twitter.getOAuthAccessToken(this.requestToken, "PIN");
//Si despues de esto todo sale bien (sin TwitterExceptions) tendremos ya acceso a los TOKENS, 
// son 2 cadenas que almacenaremos en nuestra base de datos
// y usaremos posteriormente para publicar nuestros tweets o obtener algo de informacion de nuestra cuenta.
//El token
log.debug("New Token {"+this.accessToken.getToken());
//El Token Secret
log.debug("New Secret Token {"+this.accessToken.getTokenSecret());
 //Testing send twitter, WORKS !!
//Si queremos probar que todo funciona, seteamos el ACCESS TOKEN que validamos anteriormente con el objeto Twitter.
 this.twitter.setOAuthAccessToken(accessToken);
// Publicamos algo para comprobar.
 this.twitter.updateStatus("test accessToken");
//Guardamos los dos tokens en la base de datos.

Ahora tenemos 4 codigos en nuestra tabla, los 2 codigos consumer y los 2 codigos Token, con estos 4 codigos podremos postear mientras no revoquemos nuestros permisos en nuestro perfil de Twitter.

//Para poder acceder a nuestra cuenta, postear o obtener algo de info, recuperamos nuestros
// 4 datos principales, creamos un ACCESSTOKEN seteando en el // constructor el Token y el Secret Token validos
final AccessToken accessToken = new AccessToken("Token", "Secret Token");
//Creamos una nueva instancia de Twitter y creamos una nueva instancia de autorizacion 
// con nuestras otras 2 llaves Consumer y el objeto creado 
// anteriormente ACCESS TOKEN 
Twitter twitter = new TwitterFactory().getOAuthAuthorizedInstance("Consumer Key", "Consumer Secret", accessToken);
//Una vez echo esto, ya tenemos el objeto Twitter cargado y listo para ser usado, podemos probar las credenciales.
twitter.verifyCredentials();

En otros blogs podrás encontrar muchas maneras de hacer esto, pero muchos se basan en aplicaciones de escritorio o basados en servlets, de esta forma podemos almacenar nuestras multiples cuentas de Twitter con OAuth y utilizarlas segun nuestras necesidades.

España Campeón del Mundo !!!!!

Tags: ,

Y el sueño se hizo realidad... ¡¡¡Somos campeones del mundo!!! España se ha ganado un hueco en el olimpo del fútbol gracias a un gol de Iniesta en la segunda parte de la prórroga (115′) de la final del Mundial de Sudáfrica ante una Holanda que repartió de lo lindo y a pesar del pésimo arbitraje de Howard Webb. Tuvimos que sufrir pero mereció la pena y el sueño, dejó de ser tal, para convertirse en realidad. ¡¡¡Enhorabuena campeones!!!

Crea tus Feed con RSS o Atom con Spring 3.0 y REST

Tags: , , , , ,

Hola Gente, regreso a las andadas varios meses después con una serie de artículos sobre Spring 3.0. El primero de ellos sera de unas clases nuevas que nos ofrece Spring MVC 3.0 para crear nuestros propios Feed con 2 formatos diferentes, RSS 2.0 o Atom.

Primero vamos a conocer las 2 clases abstractas disponibles desde Spring 3.0 que vamos a usar

AbstractRssFeedView

AbstractFeedView es la clase para crear  nuestra vista principal de RSS y esta a su vez se extiende de AbstractView nos ofrece metodos para crear los encabezados de nuestro RSS.

AbstractAtomFeedView

Esta clase abstracta extiende de AbstractAtomFeedView y esta tambien se extiende de AbstractView.

No es posible crear una sola clase para manejar los dos formatos, asi que trabajaremos solamente con RSS, el proceso para ATOM es practicamente el mismo.

Extendemos AbstractRssFeedView y creamos la siguiente vista. Se deben implementar 2 metodos obligatoriamente, el primero es para crear el encabezado del RSS (ojo, si no lo llenas bien recibiras una bonita excepcion) y el otro metodo es para setear todo el cuerpo del RSS.

public final class MyViewFeedRssView extends AbstractRssFeedView {
 
    /**
     * En el caso de los RSS debemos crear el Channel, parece la gente de Spring se olvido de hacerlo por nosotros, ojo
     * con llenar bien el Channel.
     */
    @Override
    protected Channel newFeed() {
        final Channel channel = new Channel("rss_2.0");
        channel.setPubDate(new Date());
        channel.setDescription("RSS Description");
        channel.setTitle("TITLE");
        channel.setLink("link");
        channel.setCopyright("2010");
        channel.setPubDate(new Date());
        return  channel;
    }
 
    /**
     * Build Feed Entries.
     */
    @SuppressWarnings("unchecked")
    @Override
    protected List buildFeedEntries(Map model, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
         // Obtenemos las entradas que vienen en el modelo desde el Controller
        List contentList = (List) model.get("entries");
        // Creamos una lista de clase de Item, el objeto de ROME que refleja cada elemento del RSS
        List entries = new ArrayList(contentList.size());
        // Iteramos nuestras entradas del blog
        for (EntriesBlog content : contentList) {
                   final Item item = new Item();
            String date = String.format("%1$tY-%1$tm-%1$td", content.getPublicationDateTweet());
            item.setTitle(String.format("On %s, %s publish", date, content.getQuestionBean().getQuestionName()));
            item.setPubDate(content.getPublicationDateTweet());
            item.setLink("http://www.encuestame.org");
            entries.add(entry);
        }
        return entries;
    }
}

Para que esta vista pueda ser interpretada por el MVC de Spring, debemos definir un RESOLVER para que pueda encontrar nuestra vista de RSS, yo siempre le doy un orden prioritario, por si tuvieramos otros RESOLVERS definidos en nuestro MVC.
Tambien agregamos como un Bean nuestra nueva vista y recordemos el ID que pronto lo usaremos.

Ahora vamos con el Controller, que es el encargado de recibir la peticion del Dispacher Servlet , usaremos Anotaciones y mapeo con REST porque somos muuuuu modernos :) . Yo extendi de una clase abstracta, que no tiene nada pero no es necesario para nuestro ejemplo.

@Controller
public class RSSFeedController extends AbstractFeedController {
 
    /**
     * Build Feed Body.
     */
    private void buildTweetPollFeedBody(String username, Model model, HttpServletRequest request, User user){
         model.addAttribute("username", username);
         model.addAttribute("feedTitle", String.format(TWEET_POLL_FEED_TITLE, username));
         model.addAttribute("url", buildDomainWithRequest(request));
         //buscamos nuestras entradas de nuestro blog, por poner un ejemplo
         final List entries = getEntries(user.getUsername());
          // las guardamos en el modelo que pasaremos a la vista y usaremos mas adelante.
         model.addAttribute("entries", entries);
    }
 
    /**
     * Display RSS Feed.
     */
     // Utilizar REST es sencillo, solo debemos definir la variable entre llaves y llamarla con la anotacion @PathVariable
    @RequestMapping(value = "/feed/{username}/entries.rss", method = RequestMethod.GET)
    public String tweetPollRss(@PathVariable String username, Model model, HttpServletRequest request) {
       // Como queremos utilizar el mismo RSS para diferentes usuarios, buscamos nuestro usuario.
        final User user = getByUsername(username);
        if(user == null){
            //TODO: if null do something.
        }
        else{
             // Como somos muy ordenados creamos otro metodo.
            this.buildTweetPollFeedBody(username, model, request, user);
        }
        // Aqui regresaremos una cadena, que no es mas que el ID de nuestra VISTA del Bean RSS.
        return "rssFeedView";
    }
}

Una vez creada toda esta estructura, lo siguiente es pan comido, simplemente cargar en el url la direccion de la siguiente manera, sustituyendo la variable {username} por el usuario virtual para que nos regrese los RSS de ese usuario.

http://localhost/feed/bonachon/entries.rss

Preguntas?

Java 4 Ever

Tags: ,

Con un toque made in Hollywood, excelente trailer de una historia de amor por Java, no tiene desperdicio. Lo que mas me gusta es el reparto de actores y atrices. Scala Johansson :D

© 2009 Jotadeveloper Blog. Nuestros contenidos están bajo licencia Creative Commons mientras no se indique lo contrario,
y pueden reproducirse libremente sin más que mencionar la fuente ("JotaDeveloper") y la URL concreta del artículo original. .

This blog is powered by Wordpress and JotaDeveloperTheme.