Twitter veilig met OAuth

 
19 mei 2009

Twitter is veruit de snelst groeiende social networking service van dit moment. Wellicht doordat het zich erg goed leent om geintegreerd te worden in webapplicaties. In dit artikel ga ik in op hoe je Twitter’s API’s kan gebruiken met Java en Facelets. Naast de meest simpele – maar redelijk onveilige –  manier van direct aanspreken, ga ik kijken hoe het veilig kan met OAuth. Wat OAuth is kom ik later op terug.

Twitter is een sociaal netwerk service wat gebruikers in staat stelt kleine berichten te plaatsen en deze te delen met vrienden of publiekelijk toegankelijk te maken. Om het makkelijker te maken de berichten van mensen te vinden kun je iemand volgen, zodat hun berichten op je eigen ‘home’ te lezen zijn. De berichten mogen maximaal 140 tekens lang zijn, en met het oog op persoonlijke berichten worden deze officieel statussen genoemd – je huidige persoonlijke status. Al worden ze tegenwoordig vaak als tweets aangeduid in samenhang met het “Twitteren”.

Om Twitter te gebruiken in een applicatie zijn er twee API’s beschikbaar gesteld. De Search API, en de REST API – gebaseerd op RESTful webservices. De Search API wordt zoals de naam al doet vermoeden, gebruikt om queries af te vuren om informatie op te halen. Deze API kan aangeroepen worden met json en atom formaten – maar hier ga ik verder niet op in. De REST API is de belangrijkste, omdat deze direct kan praten met Twitter accounts en nagenoeg alles kan wat je ook via de Twitter website kan. Deze API kan worden aangeroepen met json, xml, atom en rss formaten.

Een voorbeeld aanroep van de REST API:
http://twitter.com/statuses/show/1472669360.xml
Deze aanroep zal de status met het id 1472669360 opvragen en als antwoord krijg je een xml weergave van deze status. Om deze aanroepen te testen kan je bijvoorbeeld cURL gebruiken.

Om het gebruik van Twitter makkelijk te maken zijn er verschillende client libraries beschikbaar, waaronder enkele voor java. Ik  heb voor Twitter4J gekozen omdat deze als enige al in de Maven repository zit, zodat ik gelijk aan de slag kon. Door het onderstaande toe te voegen aan je pom haal je het binnen je project. Je kan er natuurlijk ook voor kiezen om het handmatig toe te voegen, onderaan de post staat een link naar de Twitter4J website.

<dependency>
  <groupId>net.homeip.yusuke</groupId>
  <artifactId>twitter4j</artifactId>
  <version>2.0.0</version>
</dependency>

Voor het ophalen van je eigen statussen voer je het volgende uit in de java code.

Twitter twitter = new Twitter(username, password);
List tweets = twitter.getUserTimeline();

Voor een status update wilt sturen gebruik je dit:

Twitter twitter = new Twitter(username, password);
Status status = twitter.update(message);

Zoals je ziet is het gebruik van Twitter met Twitter4J erg simpel, maar helaas niet erg veilig, omdat je de login gegevens van je gebruikers nodig hebt. Om dit wel netjes af te handelen is er wat meer nodig en schakelen we OAuth in.

OAuth is een open standaard voor het authoriseren van API aanroepen. OAuth gaat uit van een drietal spelers.

  • Service Provider: de dienst die je wilt gebruiken (bv Twitter)
  • Consumer: de partij die voor een gebruiker de dienst gaat gebruiken (je eigen applicatie)
  • User: de gebruiker die de dienst wil gebruiken

Zoals gezegd is de Consumer je eigen applicatie, maar deze moet je eerst bij Twitter aanmelden. In dit geval heb ik een Twitter account aangemaakt, en daarna een applicatie via OAuth Clients pagina geregistreerd. Wanneer je de applicatie hebt aangemaakt krijg je een Token en een TokenSecret, en deze heb je nodig om de gebruiker te laten authoriseren.

Wat er moet gebeuren is dat de gebruiker op basis van jouw applicatie token, jouw applicatie toestemming geeft zijn of haar account te gebruiken. Welke rechten je applicatie krijgt is afhankelijk van welke je vraagt. Je kunt bij de applicatie namelijk instellen of je alleen wilt lezen of dat je ook wilt schrijven (updates versturen).

OAuth gaat uit van twee type token objecten, de RequestToken en de AccessToken. De RequestToken is gebaseerd op de Consumer gegevens van jouw applicatie en kan een tijdelijke link genereren die de gebruiker kan gebruiken. De AccessToken is de token die de consumer krijgt van de service provider om gebruik te maken van het account van de gebruiker. Normaal gesproken zijn deze AccessToken’s maar tijdelijk en verloopt de mogelijkheid van de server om het account van de gebruiker te gebruiken. Twitter daarentegen heeft hier geen tijdslimiet opgezet en zal het AccessToken nooit verlopen tenzij de gebruiker het recht intrekt.

Twitter4J kan gelukkig ook gebruik maken van de OAuth functionaliteit van Twitter. Het hele proces staat hieronder uitgelegd:
OAuth & Twitter Authorization Process

Dit voorbeeld heb ik uitgewerkt met behulp van een Javabean en twee Facelets. Op de eerste facelet heb ik een <a href die indirect twee acties uitvoert. Ten eerste opent hij de AuthorizationURL die hij uit de bean haalt, ten tweede opent hij via onClick een “pop-up” in zichzelf (dus een redirect) die de andere facelet opent. De tweede facelet wil bij het laden een waarde ophalen uit de bean die ervoor zorgt dat de bean gaat wachten op antwoord van Twitter.

Terwijl de bean wacht, gaat de gebruiker naar de Twitter site die net geopend is. Daar kan de gebruiker inloggen en de applicatie authoriseren. Wanneer de gebruiker deze pagina of tab sluit, keert deze terug op de nieuwe facelet die op dat moment het antwoord van Twitter heeft en klaar is met laden.

De url in de facelet, en de “wacht” code in de bean:

<a href="#{Twitter.authorizationURL}"  target="_blank"
onclick="window.open('TwitterAuth.iface','_self','height=200, width=600, status=0, toolbar=0, resizable=0, menubar=0 ')">
 int counter = 0;
 while ((null == accessToken) &amp;&amp;(counter &lt; 5)) {
    counter++;
    try {
       Thread.currentThread().sleep(2000);
    } catch (InterruptedException ex) {
    }
    try{
       accessToken = requestToken.getAccessToken();
       returnMessage = "Successfully authorized to access your Twitter. ";
    } catch (TwitterException te) {
       if(401 == te.getStatusCode()){
          System.out.println("Unable to get the access token.");
       }else{
          te.printStackTrace();
       }
    }
  }

Dit is de basis van OAuth en Twitter en laat zien hoe makkelijk je beide kan gebruiken.
Bovenstaande was een korte introductie, mocht er tijd en animo voor zijn dan komt er nog een artikel wat verder in gaat op OAuth zelf.

Bronnen:


Werken met ?
Kijk dan bij onze mogelijkheden voor starters en/of ervaren IT'ers.


Categorieën: Development, Java (EE)

Tags: , , , ,