sobota 28. září 2013

Grails - Spring Security Facebook plugin

Dnes se mi konečně podařilo úspěšně implementovat serverové přihlašování pomocí Facebooku s pluginem Facebook Authentication for Spring Security. Kdysi jsem to zkoušel a tehdy jsem některé věci nevěděl, tak jsem to radši vyřešil klientským přihlašováním pomocí JS. Dokumentace se mi zdá zbytečně komplikovaná a v některých bodech nedostatečná, tak zde stručně popíši, jak jsem postupoval.

1) Je nutné mít vytvořenou aplikaci na Facebook Developers. Zde jsem nevěděl, co zadat do pole Přihlašování pomocí Facebooku - URL stránky (na toto URL pak Fb přesměruje uživatele, pokud bude úspěšně autentizován). Nakonec jsem zjistil, že to je jedno, protože autentizace probíhá pomocí filtrů. Dal jsem tam homepage - http://www.mujhomepage.cz
Pokud ještě nevíte, tak nelze zadat při vytvoření aplikace na Fb do polí s URL adresu localhost něco. Proto pro testování musíme upravit soubor hosts, který je součástí OS, a přidat tam fake URL (více o tomhle UTFG).

2) Instalace pluginu pro Grails. 
Při tomhle jsem se setkal s problémem, že při každém spuštění aplikace Spring Security chtěl aktualizovat na jinou verzi a pokud jsem dal aktualizovat, tak se to aktualizovalo, ale pak při dalším spuštění chtělo zase aktulizovat zpátky (takže nekonečný loop). Jádro problému bylo nakonec v tom, že Spring Security instaluji do application.properties (starý a deprecated způsob) a Facebook plugin mám definovaný v BuildConfig.groovy (nový a správný způsob). Stačí všechny pluginy definovat v BuildConfig.groovy a problém je vyřešen.

3) Spustit v Grails console tento příkaz: grails s2-init-facebook
Vytvoří za vás doménu FacebookUser, který je propojený s vaším User doménovou třídou. Také přidá pár řádků do Config.groovy. Případně vše můžete provést manuálně, viz dokumentace.
Pak ještě je potřeba doplnit do konfigurace app ID a secret ID.

4) Nastavit grails.serverUrl v Config.groovy
Tento krok jsem minule vynechal, proto mi nefungovala aplikace. Defaultně grails.serverUrl není nastaven pro development prostředí, a proto při přihlášení pomocí Fb aplikace přesměruje na odkaz localhost, proto přihlašování nefunguje. Stačí tu nastavit něco takového:
grails.serverURL = "http://www.mujhomepage.cz:8080"

5) Přidat tlačítko na přihlašování
Viz dokumentace část 3.

6) Získání detailů o uživateli
Po přihlašování často chci získat informace o uživateli jako uživ. jméno, email, avatar apod. Facebook plugin nám vrací jen token. Minule jsem to udělal tak, že jsem si napsal vlastní service třídu, připojil na Graph API a získal další informace pomocí vráceného tokenu. Pak jsem ale našel správnou odpověď na StackOverflow