Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin
Generalnie Vaadin strzela focha jak mu się chce majstrować przy przekierowaniach w oknie aplikacji. Nie jest to duży foch, ale wymaga od nas trochę pracy.
Przygotowania
Co należy mieć zanim w ogóle przejdziemy do pracy? Po pierwsze należy zarejestrować się jako deweloper do Facebooka. Następnie w zakładce „Aplikacje” tworzymy nową aplikację. Przechodzimy do jej konfiguracji i oznaczamy jako „webside” podając URL aplikacji. Posiada ona kilka ważnych elementów:
- App ID/API Key – unikalny identyfikator aplikacji.
- App Secret – „odcisk palca”, czyli tajny identyfikator.
- Site URL – adres aplikacji
- Post-Authorize Redirect URL – adres przekierowania po uzyskaniu tokena
Najważniejsze na tej liście są adresy URL. Pierwszy z nich to adres na który skieruje nas FB jeżeli wybierzemy aplikację z menu „Aplikacje” w części użytkownika. Drugi to adres, na który zostanie przekierowane żądanie po uzyskaniu tokena (zgody użyszkodnika na dostęp do profilu).
Po stronie Vaadin
Przedstawię tu kilka luźnych klas, które łączę za pomocą Guice.
Żądanie tokenu
Tu nie ma zbyt dużo filozofii no może poza fochami Vaadin 😉
Listing 1. Przykładowy listener dla przycisku logowania
class SecuriedButtonClickListener implements ClickListener {
private static final long serialVersionUID = 194416383513769075L;
@Inject
private Application myVaadinApplication;
@Inject
@Named("FB.appId")
private String appId;
@Inject
@Named("FB.redirect")
private String redirect;
@Inject
private Random random;
@SecureAction
public void buttonClick(ClickEvent event) {
myVaadinApplication.getMainWindow().addComponent(
new Label("Thank you for clicking"));
String target = "https://www.facebook.com/dialog/oauth?client_id="
+ appId + "&redirect_uri=" + redirect + "&state="
+ random.nextInt();
myVaadinApplication.getMainWindow().open(new ExternalResource(target),
"_top");
}
}
Ostatnia linijka najważniejsza. Generalnie Vaadin nie pozwala na otwieranie zasobów innych niż obrazki i pdfy w ramach dyrektywy \_self. To jest ten mały foch. Gdy użyjemy \_top bangla. Parametry są jasne no może poza ostatnim. Jest to tekstowy identyfikator żądania, który pozwala na identyfikację konwersacji pomiędzy serwerami FB, a naszą aplikacją.
Obsługa odpowiedzi
Tu też nie ma tu dużo filozofii. Vaadin udostępnia interfejs ParameterHandler służący do obsługi parametrów żądania. Dodajemy go do aplikacji.
Listing 2. Przykładowy listener dla odpowiedzi serwera
class StandardParameterHandler implements ParameterHandler {
public void handleParameters(Map<string string=""> parameters) {
for (Map.Entry<string string=""> entry : parameters.entrySet()) {
System.out.println(entry.getKey() + "="
+ Arrays.toString(entry.getValue()));
}
}
}</string></string>
Odpowiedzi serwera mogą być dwojakie. Pierwsza pojawia się w momencie gdy użytkownik zgodzi się na dostęp naszej strony do jego profilu. W takim wypadku parametry w odpowiedzi są dwa. Pierwszy state to nadany przez nas identyfikator. W Przypadku Vaadin jest on średnio przydatny ponieważ aplikacja zachowuje swój stan aż do wygaśnięcia sesji HTTP na serwerze zatem nawet po opuszczeniu okna aplikacji będzie ona wisiała przez pewien czas w pamięci i odpowiedź serwera zostanie poprawnie połączona z instancją. Drugi parametr nosi nazwę code i należy go traktować jako tymczasowy identyfikator użytkownika. Posłuży on wraz z App Secret do pobrania identyfikatora użytkownika służącego do pobierania danych z Open Graph.
Drugi typ odpowiedzi pojawia się w momencie gdy użytkownik odmówił współpracy. W tym przypadku adres zwrotny będzie zawierał parametry state, error, error\_reason i error\_description, które opisują nam co dokładnie się stało.
Podsumowanie
Przedstawiłem tu wersję minimum. W takim przypadku użytkownik został zalogowany z pomocą FB, ale nie zostały pobrane żadne informacje o jego osobie. W takim przypadku użytkownik nadal musi wprowadzić wszelkie dane takie jak nick czy avatar. Jest to bardzo wygodna metoda jeżeli chcemy użytkownikom pozwolić na identyfikację, ale nie chcemy by podawali nam swoje dane.
Należy pamiętać też o dwóch rzeczach. Pierwsza to żądanie minimum. Nie ma sensu proszenie użytkownika o udostępnianie danych jeżeli nie będziemy z nich korzystać. Druga to właściwe zabezpieczenie aplikacji. FB pozwala na identyfikację użytkownika, ale wszelkie elementy związane z zabezpieczeniem aplikacji, przyznawaniem uprawnień itp. nadal należy wykonać własnym sumptem. Logowanie z FB to tylko logowanie – username/password nic więcej.