Facebook Java-app
- tis 27 nov, 2007 kl 17:31
- 6 kommentarer
- JEE, Java
Som så många andra använder jag Facebook dagligen för att hålla koll på vad alla mina vänner gör (eftersom jag är för lat för att höra av mig på annat sätt =). Facebook vilar på en väldigt snygg arkitektur där man t.ex. har möjligheten att skapa egna applikationer som lätt integreras med hela Facebook-siten. Varför inte då prova att skapa en egen applikation i Java?
Jag började med att leta efter information om hur man får sina egna applikationer att fungera mot Facebook. På http://developer.facebook.com finns allt man behöver veta om hur man sätter igång. I stora drag fungerar integrationen mot Facebook så att när en användare går till din applikation på http://apps.facebook.com/<dinapp> anropar Facebook’s servrar i sin tur din server för att hämta innehållet som skall visas på sidan. Din applikation kan sedan hämta data från Facebook-systemet genom att använda ett REST API (en typ av WebService). Detta innebär egentligen att man kan skapa en Facebook-applikation i vilket språk som helst som kan generera websidor. Det borde alltså inte vara några problem att skapa en snygg applikation i Java tillsammans med en webcontainer (t.ex. Tomcat). Men det var här jag stötte på patrull..
Hela Facebook-plattformen är byggd i PHP och därför är stödet stort för att utveckla egna applikationer i just PHP. Det finns stora bibliotek och massor med exempel hur du sätter upp din egen applikation mot Facebook i PHP. Däremot finns det väldigt lite dokumentation om hur man sätter upp en egen applikation i Java. Det lilla som finns hittar man på Developer-Wikin, där också några länkar till externa sidor finns. De externa sidorna innehåller väldigt värdefull information, men hjälper inte hela vägen ut. Som tur är har Facebook-teamet i alla fall skapat ett Java-paket som man kan ladda ner och börja använda på en gång. Dock ser klasserna som följer med ut att vara en copy-paste från PHP-koden; klassnamnen följer inte Java-standard och objektorienteringstänket är som bortblåst.
För att överhuvudtaget kunna göra något med sin applikation, måste man först få igång autentiseringen mot Facebooks servrar. När man registrerar sin applikation på Facebook-siten får man först en API-nyckel som identifierar applikationen, en privat nyckel som fungerar som lösenord för API-nyckeln. Dessutom får varje användare en egen sessionsnyckel varje gång de loggar in. Alla tre behövs för att kunna göra ett anrop mot Facebook’s API. Dokumentationen för hela denna process är rätt så god, men för att implementera detta i Java krävs det att man håller tungan rätt i mun. Autentiseringsmekanismen är dessutom väldigt bunden till HTTP-anropen och webblagret, så frågan är hur man på ett snyggt sätt kan dela upp applikationen i lager á la MVC.
Finns det någon annan där ute som har skrivit en applikation i Java och integrerat den med Facebook? Någon som lyckats få till en ”snygg” lösning? Det måste ju gå att separera autentiseringen från webb-lagret så att man kan göra anrop mot Facebook-API:et utan att skicka runt användarens sessionsnyckel hela tiden..!
Räkna med fler blogg-inlägg om detta..
Jag har testat att göra autensiering i en javaapplikation via Facebook, vilket jag fått att fungera. Jag har även kollat på att koppla det till Acegi(Spring) Security, för att få till en lite snyggare lösning, ingen klar lösning där dock…
Facebook har ju ett RESTful API, vilket betyder att allt du egentligen behöver känna till är följande:
1. URLen du gör dina anrop mot
2. De olika parameterarna för varje operation
3. XML Schemat för det svar du får
URLen får du när du reggar din applikation (callback URL osv.). Parameterarna finns beskrivna på http://wiki.developers.facebook.com/index.php/API. Dessa parametrar ska alltså skickas som vanliga HTTP GET-parametrar. XML Schemat för facebook apps hittas på http://api.facebook.com/1.0/facebook.xsd, så du kan enkelt generera JavaBeans från det schemat med hjälp av XMLBeans t.ex.
Ska man bara skriva en enkel lite facebook applikation så behöver man inte använda deras Java API. Jag tycker det verkar mycket smidigare att jobba direkt mot deras RESTful API, än att förlita sig på deras ”Javafierade” PHP-api. Särskilt då senaste versionen av JAX-WS, och även många andra Web Service APIer (XFire t.ex.), stödjer RESTful Web Service, så skulle nog jag köra på den lösningen istället.
Lycka till. :)
Tjó
Om jag har användarnamn och lösenord, kan jag logga in mot Facebooks system utan webbläsare?
Som jag tolkar facebook-API:t så måste användaren logga in på en webbsida för att min applikation ska få åtkomst till datan.
/Acevedo
Vad jag vet så räcker det inte bara med att ha användarnamn och lösenord. Tvärt om så behöver du två andra saker för att kunna prata mot Facebook’s REST-API, nämligen: användar-id’t (en siffra alltså) och en sessionsnyckel. Sessionsnyckeln skapas av Facebook-websiten när användaren loggar in och fungerar bara medan användaren är inloggad på siten.
Facebook har krånglat till det lite onödigt mycket kan man tycka, eftersom man endast kan kommunicera med API’t genom en viss användare som måste vara inloggad vid tillfället man skall göra anropet. I.o.m. detta är det väldigt svårt att bygga ”riktiga” applikationer som interagerar med Facebook utifrån externa händelser, eller händelser som genereras av din egen applikation. Egna schemalagda tjänster som pratar med Facebook är bara att glömma. Det går ju visserligen att lösa på alternativa sätt, men det hade ju vart riktigt smidigt om man kunde anropa vissa metoder via API’t genom att bara ange vilken applikation det gäller och den hemliga applikationsnyckeln.
Om det är en riktig inloggad FB-användare som krävs för att kunna hantera externa händelser, så får man väl skapa en påhittad robot som loggar in och skaffar sessionsnycklar för applikationens räkning?
Ja, det går ju att bygga runt. Har läst några trådar om inloggnings bottar som går runt begränsningarna, men frågan är vad facebook kan göra juridiskt i de läget. Jag gissar att dom har satt P för det i sina användaravtal… :/