Meine erste Facebook-App läuft jetzt seit gut einer Woche und hat bereits über 30 “Gefällt mir”. In diesem Artikel möchte ich darüber schreiben, wie ich die Authentifizierung von Benutzern bei Facebook gelöst habe.
In einem Artikel vor gut einem Jahr habe ich noch die facebook-java-api genutzt. Die Weiterentwicklung ist etwas eingeschlafen, deshalb war ich auf der Suche nach einer anderen API. Fündig geworden bin ich bei der RestFB, ein Open Source Framework, welches direkt auf die GraphAPI von Facebook zugreift.
Der erste Schritt bei der Entwicklung einer Anwendung auf Facebook ist die Anwendung selbst anzulegen. Man erhält dann eine Anwendungsnummer und zwei Schlüssel für die Authentifizierung, den API-Schlüssel und den Anwendungs-Geheimcode. Wichtig ist noch die Canvas-URL unter Facebook-Einbindung in den Einstellungen der Anwendung festzulegen, sowie die URL der Anwendung, die Canvasseite.
Den gesamten Prozess der Authentifizierung hat Facebook ganz gut beschrieben.
Bei dem ersten Aufruf greift meine Anwendung (in Struts entwickelt) als erstes auf die Canvas-URL zu.
Folgendes passiert dann. Man holt sich den Parameter “signed_request” und verarbeitet ihn. Bei dem ersten Aufruf muss der Nutzer sich noch authentifizieren und der Anwendung die Berechtigung erteilen, auf die eigenen Profildaten zugreifen zu können.
Es wird dann erstmal aufgerufen:
if (ret.getOauth_token() == null){
return new ActionForward(authUrl, true);
}
Es erfolgt einer Weiterleitung auf die Authentifizierungs-URL von Facebook.
Die authUrl sieht so aus:
"https://graph.facebook.com/oauth/authorize" +
"?client_id=123456789" +
"&redirect_uri=http://localhost:8080/mudflat/apps/facebookauth.do?do=authSucess" +
"&scope=user_birthday";
wobei die client_id die Anwendungsnummer der Anwendung ist und unter scope die Berechtigungen stehen, die der Anwendung erteilt werden sollen. Welche Berechtigungen möglich sind, steht hier: Permissions Reference.
Der Benutzer kann die Anwendung nun hinzufügen und wird dann zur redirect_uri weitergeleitet.
Die Weiterleitungsadresse macht bei mir nichts anderes, als auf die eingebettete Anwendung bei Facebook weiterzuleiten (Canvasseite)
public ActionForward authSucess(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
return new ActionForward("http://apps.facebook.com/smd_auth_example", true);
}
Nun wird der Benutzer wieder zur Canvas-URL weitergeleitet.
Da diesmal gilt
authToken != null
kann dieser verarbeitet und der Benutzer authentifiziert werden.
Facebook schickt den Authentifizierungs-Token verschlüsselt im signed_request-Parameter mit.
Wie dieser verarbeitet wird, habe ich mir hier abgekupfert: Parsing signed_request in Java
Die Methode checkSignature(rawpayload, sig) überprüft dann, ob der Anwendungs-Geheimcode stimmt und stellt damit sicher, dass die Anwendung wirklich von Facebook aufgerufen wurde.
String sigreq = request.getParameter("signed_request");
int idx = sigreq.indexOf(".");
byte[] sig = new Base64(true).decode(sigreq.substring(0, idx).getBytes());
String rawpayload = sigreq.substring(idx+1);
String payload = new String(new Base64(true).decode(rawpayload));
/* parse the JSON payload and do the signature check */
FacebookRequest ret = new Gson().fromJson(payload, FacebookRequest.class);
/* check if it is HMAC-SHA256 */
if (!ret.getAlgorithm().equals("HMAC-SHA256")) {
System.out.println("Fehler Algorthimus");
}
/* then check the signature */
checkSignature(rawpayload, sig);
if (ret.getOauth_token() == null){
return new ActionForward(authUrl, true);
}
Ab diesem Punkt ist die Authentifizierung abgeschlossen und man kann mit der RestFB-API auf die Graph-API zugreifen:
FacebookClient facebookClient = new DefaultFacebookClient(ret.getOauth_token());
String query = "SELECT name FROM user WHERE uid=220439";
List users = facebookClient.executeQuery(query, User.class);
for (int i=0;i<users.size();i++){
User u = users.get(i);
System.out.println(u.getName());
}
Nun noch mal eine kurze Zusammenfassung:
- Anwendung bei Facebook erstellen und die Canvas URL und die Canvasseite festlegen
- Beim ersten Aufruf Weiterleitung auf die authURL und Parameter festlegen
- Durchführung der Authentifizierung mit Entschlüsselung des signed_request Parameters und Bestätigung des Anwendungs-Geheimcodes.
Hilfreich bei der Entwicklung ist noch, wenn man sich etwas in die Dokumentationen von Facebook einliest
Und hier der komplette Quellcode
Ansonsten, bei Fragen einfach melden :-)