Tvorba her na FB přes JAVU – 2. část

Estimated read time 11 min read

V první části se pouze nastínilo, jak vypadá první registrace a první příprava na start v tvorbě aplikací v Javě. Tato část ovšem odkryje detaily o tom, jak zkonstruovat a napsat svůj první kód pro základní Facebook autentifikaci, zahrnuje také příklady kódu, které můžete použít k lepšímu startu. Podrobněji bude také vysvětleno, jak servery interagují s kódem a co můžete očekávat (resp. Co servery mohou očekávat od Vás!)

Pozn.: v případě, že je uvedený zdrojový kód je kód nečitelný, tak je to proto, že zmizí z okraje obrazovky, vyberte jej proto a zkopírujte například do textového dokumentu. Nejužitečnější věcí je dát si vše dohromady do jedné třídy.

iFrames vs FBML

Facebook aplikace mohou být vytvářeny dvěma způsoby, přes iFrames nebo FBML

iFrame FBML
Standardní součást HTML, vloží jednu webovou stránku udovnitř jiné Proprietární Facebook programovací jazyk, velmi podobný HTML
Můžete si prohlédnout stránky prostřednictvím běžného webového prohlížeče k jejich otestování Nemůžete vidět nic kromě živého běhu aplikace na Facebooku
Každá Facebook stránka jde přes Váš server, takže můžete řešit problémy Všechny požadavky jsou na vnitřních Facebook serverech, takže když se něco pokazí, tak nemůžete dělat nic
Vyžaduje, abyste poskytli vlastní webserver

Může běžet bez externího serveru

*** – Pozn.: ve skutečnosti je Facebook momentálně navrhnut tak, že každý potřebuje vlastní webserver, jinak není možné FB aplikace vytvářet. Takže ikdyž by teoreticky bylo FBML rychlejší a jednodušší způsob jak vytvořit a rozběhnout aplikace, tak to v praxi neušetří ani čas, ani úsilí.

Většinou se přímo předpokládá, že chcete napsat vaši aplikaci pomocí iFrame namísto FBML. FBML je skvělý a pro některé části vaší aplikace ho budete chtít používat, ale fakt, že se aplikace nemohou ladit a debugovat je velmi obtížné. Pokud všechnu svoji kódovací práci vytvoříte viFramu, tak poté je přechod do FBML o mnoho jednodušší, ale to až přijde čas, neustálé opakování věcí dokáže akorát unavit.

 

Facebook aplikace: Podrobné vysvětlení

Co se stane, když se Facebook uživatel pokusí použít Vaši Facebook aplikaci?

  1. Uživatel otevře svůj webový prohlížeč
  2. Najde odkaz na vaši aplikaci – obvykle vaši Canvas Page URL (http://apps.facebook.com/[your app name])
  3. Klikne na odkaz
  4. Prohlížeč půjde na síť (část FB) a zažádá o webovou stránku
  5. Facebook zašle zpět navigační panel, s prázdným iframe uprostřed
  6. Facebook přesměruje prohlížeč na vaši síť (pro získání iframe) a přidává další informace na žádost uživatele
  7. Webový prohlížeč automaticky přejde na vaše stránky a FB posílá informace, které poskytl
  8. Vaše stránky vytvoří webovou stránku, a odešlou ji na prohlížeč uživatele
  9. Uživatelův prohlížeč vykreslí vaši webovou stránku v iframe vloženém uvnitř stránky, kterou dostal od FB

 

Jak to všechno vypadá pro uživatele?

  1. Uživatel otevře prohlížeč
  2. Klikne na název vaší aplikace
  3. Vaše aplikace se objeví uvnitř navigčnho panelu

 

Takže, první věc k pochopení, pokud používáte FB hodně sami, zjistíte, že je tu mnohem více děje v zákulisí, než se zobrazí pro uživatele. To bude zvláště patrné, když uděláte chybu a začnete se snažit aplikaci debugovat.

 

Autentifikace

Existují dva „režimy“, ve kterých si můžete vytvořit webové stránky pro zobrazení v rámci vaší aplikace:

  • Default (standardní)
  • Authenticated (ověřená)

V Default režimu, tj. pokud nebudete dělat nic zvláštního, tak NEMÁTE přístup k žádným údajům na Facebooku. Nemůžete zjistit nic o Facebook uživateli – nemůžete najít své jméno, nemůžete najít své přátele, nemůžete posílat příspěvky na zdi, nic.

V ověřený režimu, budete mít plný přístup ke čtení všech svých údajů u aktuálně přihlášeného uživatele. Dále údaje o uživatelch vaší aplikace (lidé, kteří si „přidali“ vaší aplikaci ke svému FB účtu), odesílání zpráv a další.

Autentifikace v Javě

FB vám poskytuje java třídy (Java class), FacebookRestClient.java, které můžete použít k ověření FB serverů. Jakmile jste ověřen instancí této třídy, tak vám bude poskytnut přístup ke všem funkcím Facebooku (čtení dat o uživatelích, posílání zpráv jiným uživatelům, atd).

 

FB částečně zdokumentoval cestu tak, že ověřování funguje, ale existuje spousta chybějících detailů. Zejména neexistuje žádná dokumentace o tom, jak používat FacebookRestClient třídu k vytvoření ověřování, a také několik metod, které se objevují aby spolupracovaly, ale ve skutečnosti se vzájemně vylučují. Je to proto, že jedna třída je zodpovědná jak za Web-based aplikace (jediný druh aplikace, kterou většina lidí někdy viděla nebo používala na Facebooku) a desktopové aplikace (které existují, ale jsou mnohem méně časté).

Stručně řečeno, je třeba:

  1. Vygenerovat URL pro vlastní přihlašovací stránku pro vaši aplikaci (http://www.facebook.com/login.php?api_key=[your api key goes here] )
  2. Odeslat přesměrování na webový prohlížeč uživatele a donutit ho jít na tuto stránku
  3. Facebook je pak přesměruje zpět na vaši „Callback URL“ stránku …
  4. Přečtěte si „auth_token“ parametr z řetězce dotazu HTTP
  5. Instanujte instanci FacebookRestClient pomocí svého API klíče a vašeho API tajemství
  6. Odvolejte .auth_getSession( auth_token ) pomocí hodnoty auth_token, kterou jste obdrželi

 

Autentifikace vašich servletů

Nyní si můžete všimnout problému s výše napsanými událostmi. Tradičně máte při psaní aplikace J2EE více servletů, jeden pro každou „stranu“ svých webových stránek – ale v zájmu ověření, musí servlet přesměovat uživatele zpět na Facebook, který pak vždy pošle uživatele zpět na Callback URL stránky, což znamená, že bude odeslán na „špatné“ straně.

Poznámka: jen proto, že přesměrujete uživatele na FB stránku s přihlášením, tak to neznamená, že uvidí přihlašovací stránku – v případě, že jsou přihlášeni na Facebook, tak je Fb automaticky pošle rovnou na vaší stránku (ale tentokrát se zadávávají přihlašovací údaje přímo z vaší stránky, u které to nejde jinak udělat)

Takže, Facebook připouští pouze jeden servlet k ověření Facebooku – podle toho co jste dali servletu za adresu když jste vyplnili “Callback URL“ políčko, když jste vytvářeli vaši aplikaci na Facevook stránce pro vývojáře.

Ačkoliv, to není zas tak velký problém. J2EE servlety mají tzv. “Session objekt“, který automaticky udržuje obsah, postará se o toto: pokud jste někdy chtěli, aby byl uživatel ověřen při používání aplikace, stačí, aby se uživatel do Callback URL stránky přihlásit jednou (jak je uvedeno výše, pokud je již přihlášen k FB, uživatel nebude vyzván k přihlášení znovu, ale můžete donutit FB k opětovné kontrole přihlášení), a pak uložil ověřenou instanci FacebookRestClient.java v objektu Session J2EE takto:

 

protected void doGet(HttpServletRequest request, HttpServletResponse response)
{
 ...
 FacebookRestClient authenticatedClient = new FacebookRestClient( apiKey, secret );
 authenticatedClient.setIsDesktop(false);
 request.getSession().setAttribute( "auth", authenticatedClient );
}

Pak, když je potřeba vyslechnout Facebook o všech údajích v některém z vašich servletů, přinese se ověřená FacebookRestClient instance z relace J2EE a může se použít přímo takto:

 

protected void doGet(HttpServletRequest request, HttpServletResponse response)
{
 FacebookRestClient authenticatedClient = (FacebookRestClient) request.getSession().getAttribute( "auth" );
 ...
}

Popravdě, radím vám aby jste si vyhradili jeden servlet zcela čistě pro přihlašování na Facebook a udělejte tomu servletu jeden Callback URL.

Například zdrojový kód pro FacebookLoginServlet.java byste mohli použít přímo pro tento servlet. Všimněte si, že zdrojový kód předpokládá, že používáte Apache Log4j k protokolování – možná ho budete chtít změnit k používání Sun java.util.logging API. Radím vám alespoň používat nějakou formu protokolování (to hodně pomáhá při ladění!)

 

Staré přihlášení

Musíte také zvládnout situaci, kdy uživatel opustí svůj prohlížeč na další čas, příliš dlouhý na to, aby doba přihlášení na J2EE a/nebo na Facebooku vypršela a poté byla obnovena. Pokud jste začali s metodou doGET/doPOST na vašich servletech s požadavkem request.getSession(), zjistíte, že je buď přihlášení prázdné nebo bez klienta, nebo když už tam nějaký je, tak se pokusí invokovat metodu, ale marně, díky FacebookException‘s. Přesněji, vše co bude špatně závisí na implementaci vašeho J2EE obsahu a na tom jak dlouho udrží dobu přihlášení bez jejího vypršení (a zda připojený webový prohlížeč obdržel všechny Cookies).

V současné době za tímto účelem doGET využívám metodu pokus omyl, je možné vak zkusit toto:

{
 try
 {
 ...
 }
 catch( FacebookException e )
 {
 logger.error( "Facebook exception, probably due to timeout on authentication; sending error page to user", e );
 String loginPage = "http://www.facebook.com/login.php?api_key="+apiKey+"&v=1.0";
 response.getWriter().println( "<h1>Error: Couldn't talk to Facebook</h1>" );
 response.getWriter().println( "Your Facebook session has probably timed out" );
 response.getWriter().println( "Please <a ref=\""+loginPage+"\">click here</a> to login again");
 }
}

Testování

Pro moje základní testování jsem vytvořil servlet, který by načítal uživatelské-id z aktuálně přihlášeného uživatele Facebooku, zeptal by se ho na seznam všech jmen svých přátel. To je stejný základní test, který Facebook používá ve svém jednom kus ukázkový kódu java, jejich API.ean uživatel vidí na přihlašovací stránce – v případě, že je již přihlášen ke službě Facebook, FB jen automaticky pošle rovnou do vaší site (ale tentokrát to dává přihlašovací informace vaší stránky)

{

 protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, FacebookException
 {
 FacebookRestClient client = (FacebookRestClient) request.getSession().getAttribute("facebookClient");
 client.setDebug(true);

 logger.info( "Fetching friends for user to prove that our auth to FB's server worked OK ... should see a list of \"uid\"s now, with NO java-exceptions!");
 Document d = client.friends_get();

 FacebookRestClient.printDom(d, " ");
 }
}

Závěr

Teď můžete mít:

  • Facebook aplikaci, která je propojená s Facebookem, který zobrazuje obsah z vašich základních servletů
  • přihlašovací servlet, jako váši Callback URL, která automaticky přihlašuje uživatele FB
  • jednoduchý test servletu, který přesměruje po ůspěšném přihlášení a který vtiskne všechny uid vašich přátel do servletu

V další části, se pravděpodobně prestanu zaměšovat na problémy a půjdu rovnou k věci

 

 

 

Další články

Další články autora