Thema Sicherheit bei Facebook:

Es soll (in deutscher Sprache) beschrieben werden, wie eine Anmeldung an eine facebook-Anwendung funktioniert. Die Anwendung soll "gleichheit_jg" lauten, eine interne FB-Canvas-Anwendung.
Der Benutzer drückt hierbei z.B. auf einen Verweis(engl.: link), welcher im unsicheren Internet gefunden wurde, um eine Anwendung starten zu können. Drei Dinge sind für den Anwender wichtig:
- Die Anwendung ist tatsächlich diejenige, für die es sich mit Namen ausgibt. Dies hat facebook in der Hand, nämlich die richtige Weiterleitung anhand vom Anwendungsentwickler intern gespeicherten Einstellungen, welche ein Hacker von aussen nicht kennen dürfte (Authentifizierung).
- Die Anwendung muss um Zugriffsrechte bitten, welche der Benutzer steuern kann, dazu kommt ein Dialog, um Datenmissbrauch von privaten Angaben des Benutzers zu verhindern oder anzuzeigen (Autorisierung).
- Die https-Technologie (SSL) wird eingesetzt, dass ein Lauscher im Netz zwischen dem Benutzer und facebook die gemachten Eingaben nicht unverschlüsselt mitlesen (und später benutzen) oder abändern kann, so dass dann eine andere gefährliche Anwendung stattdessen aufgerufen wird. Annahme: es wird in der Fb-Anwendung eine existierende php-Seite angegeben. Es entspricht dem Eintrag "Adresse der Webseite".

Notation:
-------------------------------
FB=facebook
Anwender=Person mit FB-Konto, welche eine FB-Anwendung starten will
Programmierer=Ersteller der Anwendung, Besitzer mehrerer Dateien und Verwalter der Anwendungs-Einstellungen
API=Application programmer interface, Möglichkeit, Funktionen auzurufen und Daten lesen zu können

1) Web-Seite mit einem Verweis auf eine FB-Anwendung

Der Verweis, den man aufrufen kann, lautet folgendermassen:
<a href="siehe unten">gleichheit_jg</a>
https://www.facebook.com/dialog/oauth?client_id=178799588928777&redirect_uri=http://juga.lima-city.de/gleichheit_jg.php
Die Angabe vor dem Fragezeichen muss so sein, wenn nicht, liegt Betrugsversuch vor, dann keine FB-Anwendung !
Die client_id enthält die Identifikation der Anwendung, der Programmierer sieht diese anhand der Anwendungs-Einstellungen.
Die redirect_uri ist wichtig, weil diese Seite (siehe Schritt 5) dann Informationen erhält, um auf die FB-API zugreifen zu können. Es sollte deshalb eine aktive Seite sein, also PHP, nicht nur HTML. Die Seite muss in der vom Programmierer angegebenen Domäne liegen, um Angriffe wie cross-Site-Scripting zu unterbinden. Facebook prüft dies !

2)Die Anmeldung von Benutzerkennung

Es kommt folgende Adresse: https://www.facebook.com/login.php?api_key=178799588928777&skip_api_login=1&display=page&cancel_url=http%3A%2F%2Fjuga.lima-city.de%2Fgleichheit_jg.php%3Ferror_reason%3Duser_denied%26error%3Daccess_denied%26error_description%3DThe%2Buser%2Bdenied%2Byour%2Brequest.&fbconnect=1&next=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fpermissions.request%3F_path%3Dpermissions.request%26app_id%3D178799588928777%26client_id%3D178799588928777%26redirect_uri%3Dhttp%253A%252F%252Fjuga.lima-city.de%252Fgleichheit_jg.php%26display%3Dpage%26response_type%3Dcode%26fbconnect%3D1%26from_login%3D1&rcount=1
Es wird also ein "sicherer" https-Dialog gemacht, der FB-Anwendungsname und zwei Eingabefelder angezeigt. Die Adresse ist lang, weil auch Informationen drin sind, wenn die Anmeldung nicht geklappt hat (Falsches Benutzerkonto oder Passwort). Mit dem Parameter display= sieht man, welchen Gerätetyp der Aufrufer hat (page=normaler PC, touch=iPhone/Android etc).

3) Es kommt eine Rückfrage über eine Identifikation des Anmeldegerätes

Dies ist optional und erscheint, falls man "login-Notifications" an hat, es dient aber der Sicherheit. Denn bei fehlgeschlagenen Anmeldeversuchen auf das FB-Konto (z.B von Unbefugten) meldet FB dann beim nächsten erfolgreichen Versuch, bei welchem Gerät (möglichst mit Standort) es nicht funktioniert hat, was Angriffsversuche aufzeigen kann.
https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fpermissions.request%3F_path%3Dpermissions.request%26app_id%3D178799588928777%26client_id%3D178799588928777%26redirect_uri%3Dhttp%253A%252F%252Fjuga.lima-city.de%252Fgleichheit_jg.php%26display%3Dpage%26response_type%3Dcode%26fbconnect%3D1%26from_login%3D1&isfbconnect=1

4) Dann kommt die Frage nach den Berechtigungen, die die Anwendung haben will

Eine Anwendung braucht Berechtigungen, um auf Daten des Benutzers wie Freunde, Photos oder Veranstaltungen zugreifen zu können. Diese müssen der Anwendung also hier gegeben werden.
https://www.facebook.com/dialog/permissions.request?_path=permissions.request&app_id=178799588928777&client_id=178799588928777&redirect_uri=http%3A%2F%2Fjuga.lima-city.de%2Fgleichheit_jg.php&display=page&response_type=code&fbconnect=1&from_login=1
Hat man der Anwendung einmal Berechtigung gegeben, kommt dieser Dialog später nicht mehr, ausser die Anwendungen will neue Rechte als bisher haben.
Um z.B. noch auf Gruppen und Ereignisse zugreifen zu können (falls der Programmierer dies nicht in den bisherigen Eintragungen hatte), ist noch folgendes zu tun (Opt-In-Verfahren, Angabe von scope):
https://graph.facebook.com/oauth/authorize?client_id=178799588928777&redirect_uri=http://juga.lima-city.de/gleichheit_jg.php&scope=user_groups,user_events
Hierbei gibt es drei inhaltliche Kategorien, Veröffentlichungsberechtigungen wie publish_stream, Datenberechtigungen Benutzer wie z.B. user_groups und Datenberechtigungen Freunde wie z.B. friends_groups.

5) Bei Bestätigung mit ja kommt folgendes

Es wird die bei Schritt 1 angegebene Adresse (redirect_uri) aufgerufen, welche im Besitz des Anwendungsprogrammierers ist.
http://juga.lima-city.de/gleichheit_jg.php?code=AQDZWxmTABfBifnk7wH2Oir2X1Vgj4Pa2AK2FdujnYa6lRhDX9juQ84eD2SCsChzA1-CVkwjWmBdQ-xEKHb0sHxuH4abTUVaqh8SsVSabIbZ8TkT2Q_Xntv4GPz464OobEMHKNU81oLMGQc8rHa4cBM73YYo-a55CyvBqZyCFLEyl9ENPNtO_QzmxASuAJ_IuBRpgYFO-AcAYrDbS_KhEopp#_=_
Hier liegt dann ein temporärer Schluessel vor (Verifizierungscode). Dieser ist nur im Zusammenhang mit der Anwendung+Benutzer gültig, und wird bei neuer Anmeldung neu von FB generiert.

6) Zugriffsschlüssel für die FB-API

Mit dem Code von Schritt 5 und dem geheimen API-Schlüssel kann diese Seite nun einen Zugriffsschlüssel für die API generieren. Dazu muss eine Anfrage an folgende Adresse erfolgen:
https://graph.facebook.com/oauth/access_token?client_id=178799588928777&redirect_uri=http%3A%2F%2Fjuga.lima-city.de%2Fgleichheit_jg.php&code=xx&client_secret=yy
Die Rückgabe ist eine JSON-Struktur (access_token=zz).
HTML-Format sollte man deshalb nicht für die "redirect_uri"-Seite verwenden, weil man sonst "client_secret" beim Aufruf in einem Browser erkennen kann (nicht in der Anzeige, sondern im Quelltext) und von dort eine Abfrage einer www.facebook.com-Seite über AJAX wegen Sicherheitsbeschränungen scheitern wird (same-origin-policy), da der Anwendungsprogrammierer ja eine andere Domäne nutzt. Es bietet sich also PHP an, was man z.B. auf lima-city.de oder heroku kostenlos verwenden kann.

7) Anwendung nutzt API

Die Anwendung auf der redirect_uri-Seite kann sich nun Informationen zu dem Benutzer über die API holen, der die Anwendung gerade gestartet hat. Den access-token muss man hierbei mitgeben oder als Cookie speichern.
https://graph.facebook.com/me/friends?access_token=xy
Ist der access_token nicht gültig oder fehlt, wird bei obigem Aufruf ein Authentifizierungsfehler erzeugt, also HTTP-Fehler 4xy. Da FB einige sicherheitsrelevante Daten in den sog. Cookies speichert, sollten nach Abmeldung diese Cookies gelöscht bzw. überschrieben werden.


Literatur:
Andre Wussow, "Facebook-Applikationsentwicklung", Data-Becker-Verlag (ohne Jahresangabe)
Michael Kamleitner, "Facebook-Programmierung", Galileo Verlag 1.Auflage 2012