Szerző: Mezei József

Facebook autentikáció Androidon

Minden bizonnyal sokan kerültünk már olyan szituációba, mikor egy alkalmazást megnyitottunk a mobilunkon, majd a bejelentkező képernyőt láttuk magunk előtt és döntenünk kellett, hogy a hosszadalmas és unalmas regisztrációt választjuk (majd az email cím validálást követően jelentkezünk be) vagy csak szimplán a kék gombra kattintunk, hátra dőlünk és egy kellemes nyújtózás mellett a Facebook fiókunkat használjuk bejelentkezésre.

Tarts velem és megmutatom, miként tudod te is integrálni az alkalmazásodba a Facebook bejelentkezést.

Válj Facebook fejlesztővé

Első lépés, hogy Facebook fejlesztővé kell előléptetnünk magunkat. Ehhez keressük fel a developers.facebook.com weboldalt és klikkeljünk a jobb felső sarokban található Log In gombra. A bejelentkezést követően ugyancsak a jobb felső sarokban lévő opciót kell használnunk, tehát húzzuk az egeret a profilunkra és válasszuk az Add a New App lehetőséget. A felugró ablak mezőit töltsük ki:

  • Display Name: Ez a név fog megjelenni minden fejlesztő/tesztelő számára, illetve ezzel azonosítódik az alkalmazásunk a developer fiókunkban
  • Contact e-mail: ezen az email címen keresztül tudnak velünk kapcsolatba lépni

Ezzel meg is volnánk, kattinthatunk a Create AppID gombra és már látható is az alkalmazáshoz tartozó fiókunk.

Facebook App beállítások

Győződjünk meg arról, hogy a baloldali menüből a kívánt alkalmazást választottuk ki és ennek Dashboard felülete látható előttünk. Az itt megtalálható App ID-ra a későbbiekben még szükségünk lesz. Kattintsunk a Settings menüpontra és alkalmazzuk a következő beállításokat:

  1. (Válasszunk Category-t)
  2. Kattintsunk az Add Platform lehetőségre, majd válasszuk az Android opciót. Töltsük ki az így hozzáadott panel beviteli mezőit:
  • Google Play Package Name: E mező kitöltéséhez nyissuk meg az alkalmazást, melyet fejlesztünk. Navigáljunk el az alkalmazás-szintű build.gradle fájlhoz és nyissuk meg. Keressük ki az applicationId-t és a hozzá tartozó értéket másoljuk be a mezőbe (pl. hu.ponte.social.sample)
  • Class Name: Itt adható meg az Activity neve, melyet a Facebook meg fog nyitni. A Facebook támogatja az ún. deep link lehetőséget, vagyis egy Intentet hoz létre, mellyel vissza fog hívni az alkalmazásba. Megadása az alkalmazás ID-val közösen értendő (pl. hu.ponte.social.sample.activities.WelcomeActivity)
  • Key Hashes: fontos mező, ugyanis csak azokkal a keystorral aláírt alkalmazásokat engedi a Facebookhoz kapcsolódni, melyeknek itt megtalálható a hash értéke. A szükséges hash-t utólagosan is le tudjuk kérdezni a következő parancs használatával:
keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64

Előfordulhat, hogy a keytool-t nem ismeri a rendszer (bash: keytool: command not found), ez esetben győződjünk meg arról, hogy a JDK (Java Development Kit) fel van telepítve és megtalálható a környezeti változók között is, ellenkező esetben a már említett hibaüzenetet kapjuk. Az OpenSSL-t, pedig letölthetjük az OpenSSL oldalról. Egyéb megoldás lehet, ha a kód futtatásához Linux alapú terminált használunk, például Git Bash-t, majd el navigáljunk abba a mappába, melyben megtalálható a kérdéses keystore.

Végre kódolunk

A projekt felső szintű könyvtárában található build.gradle fájlhoz adjuk hozzá a következő sort:

Repositories {
   mavenCentral() 
}

Ezek után az alkalmazás szintű build.gradle fájlban található függőségeket egészítsük ki (érdemes mindig a legfrissebb verziót használni, így ha elérhető frissebb változat, akkor azzal dolgozzunk tovább):

compile 'com.facebook.android:facebook-android-sdk:4.22.0'

Az így hozzáadott függőségek után szinkronizáljuk a gradle fájlokat, így letöltésre kerül a Facebook SDK, amivel a továbbiakban dolgozni fogunk. A szinkronizálás végeztével adjuk hozzá az AndroidManifest fájlhoz a következő sorokat:

<manifest … >
   <uses-permission android:name="android.permission.INTERNET"/>
   <application … >
   <meta-data
android:name="com.facebook.sdk.ApplicationId"
  android:value="#App ID"/> </application> </manifest>

Ahol az #App ID helyére a korábban már említett App ID-t kell helyeznünk (ez a developers.facebook.com oldalon létrehozott alkalmazás dashboardján található). Ezt az ID-t, azonban nem ajánlott közvetlenül a Manifestbe égetnünk. Létrehozhatunk egy xml fájlt (pl.: res/values/keys.xml), majd a Manifest fájlban meg tudjuk hivatkozni a létrehozott kulcsot (pl.: @string/facebook_id). E megoldás esetében lehetőségünk nyílik arra, hogy külön kezeljünk tesztelésre felállított környezetet és éles környezetet. Vegyük észre, hogy ekkor a hash értékeket külön kell megadnunk alkalmazásonként és ezt a szétválasztást kell alkalmaznunk a fejlesztői környezetben is. Hozzuk létre az src/debug/res/values/keys.xml-t és az src/release/res/values/keys.xml-t, majd e fájlokba helyezzük el a kulcsokat. Amennyiben debug típusú apk-t készítünk a debug mappában található kulcsot használja, release apk készítésekor pedig a release-hez tartozó kulcs lesz felhasználva. 

Adjunk hozzá a tervezett felülethez egy gombot (vagy használhatjuk a Facebook által ajánlottat) és iratkozzunk fel az OnClickListener eseményre. A gomblenyomás esemény kiváltódását követően el fogjuk indítani az autentikációs folyamatot, melyhez szükségünk lesz egy Login Manager példányra. Figyeljünk, hogy a megfelelő LoginManager -t importáljuk be!

import com.facebook.login.LoginManager

LoginManager loginManager = LoginManager.getInstance();

A LoginManager logInWithReadPermissions metódusával indíthatjuk el a bejelentkezést, melynek paraméterlistája számos lehetőséget kínál számunkra. Egyszerű bejelentkezés esetén bőven elegendő a logInWithReadPermissions() metódus használata. Az igényelhető permission-ok listája elérhető a következő linken: Facebook permissions

private static String[] FACEBOOK_PERMISSIONS = new String[]{"email"};

private View.OnClickListener logInListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
loginManager.logInWithReadPermissions(MainActivity.this, Arrays.asList(FACEBOOK_PERMISSIONS));
}
};

Érdemes azonban figyelnünk, hogy milyen engedélyeket kérünk el, hiszen a felhasználók nem szívesen adnak meg minden jogosultságot az alkalmazások számára, főleg azokat nem, melyek túlmutatnak az alkalmazás reális igényein, így bánjunk ezekkel az adatokkal nagyon csínján! Esetünkben bőven elegendő lesz az email cím elkérése. Ha a felhasználó már bejelentkezett, az autentikáció nem történik meg ismét, a Facebook SDK kezeli ezt a szkenáriót, így erre nem kell külön figyelnünk.

Következő lépésben írjuk felül az onActivityResult metódust, ugyanis ezen keresztül fog visszajelezni a Facebook az autentikáció kimenetéről. Érdemes kihasználnunk a FacebookCallbackManagert is, melynek közvetlenül átadhatjuk az eredményül kapott információt, ugyanis ezen keresztül valósítható meg az eredmény fekete doboz szerű felhasználása. Ehhez deklaráljunk egy CallbackManager -t, és regisztráljuk be a LoginManager példányán keresztül, valamint az onActivityResult metódusban kapott adatokat adjuk át a CallbackManagernek.

CallbackManager callbackManager = CallbackManager.Factory.create();
loginManager.registerCallback(callbackManager, facebookCallback);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
  callbackManager.onActivityResult(requestCode, resultCode, data);
}
private FacebookCallback<LoginResult> facebookCallback = new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {

}

@Override
public void onCancel() {

}

@Override
public void onError(FacebookException error) {

}
};

Most már be tudunk jelentkezni, ám szükséges kezelnünk a bejelentkezési azonosítót, melyet elkérhetünk az alkalmazás indulásakor, illetve minden kijelentkezést követő bejelentkezés alkalmával. Azért tehetjük ezt meg, mivel a Facebook API kezeli a bejelentkezett felhasználó tokenjét, így nem szükséges nekünk külön letárolnunk.

AccessToken.getCurrentAccessToken();

Utolsó lépésként valósítsuk meg a kijelentkezést. Itt figyelnünk kell arra, hogy olyan felhasználót léptessünk ki, aki korábban már bejelentkezett:

private boolean isFacebookLoggedIn() {
return AccessToken.getCurrentAccessToken() != null;
}

public void logOut() {
if (isFacebookLoggedIn())
    loginManager.logOut();
}

Megfigyelhetjük, hogy az újabb bejelentkezést követően nem szükséges ismételten megadni az engedélyt az igényelt jogosultságokhoz. A Facebook indoklására hivatkozva erre azért nincs szükség, mivel a felhasználóban negatív érzéseket kelthet, ha túl sokszor kérünk engedélyt személyes adatainak megtekintéséhez.

Jó ha tudod

Lehetőségünk van a token változásának követésére. E célból hozzunk létre egy AccessTokenTracker típusú változót és példányosítsuk:

AccessTokenTracker facebookTokenTracker = new AccessTokenTracker() {
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
   if (currentAccessToken != null && !currentAccessToken.isExpired())
      facebookToken = currentAccessToken;
  }
};

Adminisztrátorok és tesztelők hozzáadása

Látogassunk vissza a developers.facebook.com oldalra és keressük meg a Roles menüpontot. A tesztelők hozzáadása abban az esetben szükséges, ha az App Review menüpont alatt található Make logintest public? lehetőségnél a No opció szerepel, ugyanis ez esetben csak azok a felhasználók tudnak belépni az alkalmazásba, akik regisztrálva vannak, mint tesztelők. Ha a Yes opciót választjuk, akkor ez a lépés elhagyható, ekkor bárki be tud jelentkezni az alkalmazásba a saját Facebook fiókjával, azonban ez esetben a category meghatározása kötelező.

Engedélyek utólagos megvonása

Korábban már említésre került, hogy újabb bejelentkezés alkalmával nem kér a Facebook engedélyt adataink megosztására. Ez alól egyetlen kivétel ismeretes. Webes bejelentkezést követően törölni tudjuk alkalmazásunkat a Facebook alkalmazásink közül, miáltal minden jog megvonásra kerül, melyet korábban már megadtunk. Ennek megfelelően a Facebook az ezt követő bejelentkezéskor újból engedélyt fog kérni adataink megosztásához.

Ha tetszett a cikk oszd meg másokkal is.