TB

Entwicklung von Facebook-Anwendungen mit PHP # Teil 2

Geschrieben am Donnerstag, 4. November 2010

Hinweis: Seit der Veröffentlichung dieses Tutorials gab es sehr viele Änderungen an der Facebook-API, weshalb möglicherweiße ein Vielzahl der Beispiele und Schritte nicht mehr wie gewünscht funktionieren bzw. nachvollziehbar sind. Da ich mich mit den vorgenommenen Änderungen an der Facebook-API nicht weiter beschäftigt habe, kann ich zu den dadurch auftretenden Problemen leider keine Hilfe geben!

Dieser Teil wurde teilweiße aktualisiert am 12.01.2012 …

Dieser zweite Teil einer kleinen Artikel-Serie, welche sich mit den Grundlagen der Entwicklung von Facebook-Anwendungen mit PHP handelt, beschäftigt sich mit der Einforderung erweiterter Rechte.

Nahezu jede Social-Anwendung lebt von den Daten seiner Benutzer. Da Facebook ein relativ umfangreiches Sicherheits- und Datenzugriffs-Konzept besitzt, welches den Zugriff auf die Benutzerdaten aufgrund strenger Datenschutz-Richtlinien genauestens regelt, muss eine Facebook-Anwendung für den Zugriff die erforderlichen Rechte besitzen. Wie dies in der Praxis umgesetzt wird, soll dieser zweite Teil dieser Artikel-Serie zeigen. Alle benötigten Ressourcen, wie zum Beispiel der Link zum Facebook PHP-SDK, befinden sich im ersten Teil der Artikel-Serie.

Allgemeine Überlegungen

Bevor wir mit der Erweiterung unserer Anwendung beginnen, müssen wir uns zunächst Gedanken darüber machen, auf welche Benutzer-Daten wir zugreifen wollen. Möchten wir nur Zugriffsrechte auf allgemeine Daten wie zum Beispiel Name und Vorname haben, können wir diese ganz einfach mit der Standard-Login-Funktion einfordern.

Allerdings nimmt diese Funktion viele weitere Argumente entgegen, mit der wir unserer Anwendung erweiterte Rechte geben können. Dazu gehören zum Beispiel Rechte für die Veröffentlichung von Neuigkeiten auf der Pinnwand des Benutzers sowie zur Erstellung von Veranstaltungen. Auch Rechte für den Zugriff auf erweiterte sensiblere Daten wie E-Mail-Adresse, Fotos und Arbeitgeber können erlangt werden. Eine Liste mit allen einforderbaren Rechten findet sich auf der Facebook-Entwickler-Seite Extended Permissions.

In unserer Beispiel-Anwendung wollen wir uns darauf beschränken, nur Rechte für den Zugriff auf allgemeine Daten und auf die E-Mail-Adresse des Benutzers einzufordern. Außerdem möchten wir die Erlaubnis dafür haben, Neuigkeiten auf der Pinnwand des Benutzers veröffentlichen zu dürfen.

Einbinden des Facebook PHP-SDK

Nun werden wir das Facebook PHP-SDK einbinden, welches wir vorher heruntergeladen haben – der Link dazu findet sich in der Ressourcen-Übersicht im ersten Teil dieser Artikel-Serie. Benötigt werden alle Dateien, welche sich im Unterordner /src des Archives befinden. In unserer Datei index.php muss dafür die Datei facebook.php eingebunden werden. Danach muss ein neues Facebook-Objekt erzeugt werden, um die entsprechende Verbindung zu Facebook herzustellen. Um dieses Facebook-Objekt initialisieren zu können, benötigen wir die App-ID/API-Schlüssel sowie den Anwendungs-Geheimcode. Diese finden wir auf unserer Anwendungs-Übersicht-Seite.

Außerdem wollen wir, dass unsere Anwendung seine Session als Cookie abspeichert. Unser Code innerhalb der index.php-Datei sieht dann folgendermaßen aus:

require 'facebook.php';

$facebook = new Facebook(array(
	'appId'		=> '1234567890',
	'secret'	=> 'abcdefghijklmnopqrstuvwxyz',
	'cookie'	=> true
));

Die benötigten Rechte einfordern

Als nächstes werden wir die benötigten Rechte vom Benutzer einfordern. Dazu rufen wir über das Facebook PHP-SDK eine Login-Funktion auf, der wir mehrere Argumente übergeben müssen. Die wichtigsten Argumente sind dabei die Berechtigungs-Namen, welche wir innerhalb der Entwickler-Dokumentation auf der Extended Permissions-Seite finden. Daneben benötigt die Funktion noch URL’s die ihr sagen, auf welche Seite sie den Benutzer nach dem Erlangen der Rechte beziehungsweiße einer Rechte-Verweigerung weiterleiten soll.

Da wir neben allgemeinen Funktionen auch noch Zugriff auf die E-Mail-Adresse sowie eine Erlaubnis für das Veröffentlichen von Neuigkeiten auf der Pinnwand des Benutzers haben möchten, sieht unser Code dafür folgendermaßen aus:

$loginUrl = $facebook->getLoginUrl(array(
	'canvas'		=> 1,
	'fbconnect'		=> 0,
	'req_perms'		=> 'email, publish_stream',
	'next'			=> 'http://apps.facebook.com/facebookthomasbelser/index.php',
	'cancel_url'	=> 'http://apps.facebook.com/facebookthomasbelser/fehler.php'
));

Diese Funktion liefert uns eine Login-URL auf eine Facebook interne Authentifizierungs-Seite zurück, welche die Rechte Einforderung für uns gesichert abwickelt. Außerdem meldet sie uns, wie der Name schon sagt, bei die Anwendung an und generiert eine Session, die von unserer Anwendung entgegengenommen und – wie während der Facebook-Objekt-Initialisierung definiert – als Cookie gespeichert wird.

Deshalb leiten wir den Benutzer nach der Generierung dieser Login-URL direkt auf diese Seite weiter:

echo '<script>top.location.href = "' . $loginUrl . '"</script>';

Rufen wir nun unsere Anwendung auf, werden wir automatisch auf eine Seite umgeleitet, auf welcher wir die eingeforderten Rechte genehmigen sollen. Lassen wir dies zu, werden wir wieder zurück auf unsere index.php-Datei weitergeleitet. Verweigern wir allerdings die Anfrage nach erweiterten Rechten, gelangen wir auf die fehler.php-Datei.

Session-Abfrage

Da wir nach dem Einloggen wieder zurück auf unsere index.php-Datei geleitet werden, wird bei dem momentanen Zustand nach der Genehmigung der Rechte-Erweiterung eine Endlosschleife eintreten, da die Anwendung uns immer wieder neu anmelden will.

Um dies zu verhindern, müssen wir eine Überprüfungs-Routine in die Anwendung integrieren, welche nach einer bereits vorhandenen Session sucht und nur bei einer fehlenden Session den Benutzer anmeldet. Dies realisieren wir mit der im Facebook PHP-SDK bereitgestellten getSession-Funktion und einer einfachen Bedingungsprüfung.

Der komplette Code unserer index.php-Datei sieht nun folgendermaßen aus:

<?php

require 'facebook.php';

$facebook = new Facebook(array(
	'appId'		=> '1234567890',
	'secret'	=> 'abcdefghijklmnopqrstuvwxyz',
	'cookie'	=> true
));

$session = $facebook->getUser();

if ($session){
	echo 'Hello World!';
}
else
{
	$loginUrl = $facebook->getLoginUrl(array(
		'canvas'		=> 1,
		'fbconnect'		=> 0,
		'req_perms'		=> 'email, publish_stream',
		'next'			=> 'http://apps.facebook.com/facebookthomasbelser/index.php',
		'cancel_url'	=> 'http://apps.facebook.com/facebookthomasbelser/fehler.php'
	));

	echo '<script>top.location.href = "'.$loginUrl.'"</script>';
}

?>

Damit haben wir unsere Anwendung nun mit einer funktionierenden Rechte-Abfrage ausgestattet.

Dies war zweite Teil bezüglich dem Thema „Entwicklung von Facebook-Anwendungen mit PHP“. Der dritte Teil beschäftigt sich mit dem Auslesen und der Ausgabe von Benutzerdaten.

Kommentare (14):

Michael Kania 28. Dezember 2010

Hallo Thomas,

der erste Teil dieses Tutorials ist ja wirklich o.k., aber der zweite ist nicht so ganz klar! Du schreibst:
„Zuerst binden wir innerhalb unserer index.php-Datei das Facebook PHP-SDK ein, welches wir vorher heruntergeladen haben – der Link dazu findet sich in der Ressourcen-Übersicht im ersten Teil dieser Artikel-Serie. Benötigt wird nur die Datei facebook.php, welches sich im Unterordner /src des Archives befindet.“

Was meinst Du hier mit „einbinden“, wie wird das gemacht?

Ich habe diese Datei facebook.php im selben Verzeichnis, wo ich auch die index.php auf meinem Server habe, aber wenn ich dann meine Anwendung über http://apps.facebook.com/… aufrufe, bekomme ich die Fehlermeldung, dass ein Parser-Fehler bei der facebook.php-Datei aufgetreten ist. – Muss ich denn die facebook.php-Datei, die ja Bestandteil des Facebook PHP SDK ist, auch noch irgendwie verändern?

Für eine Antwort wäre ich sehr dankbar!

Mcihael Kania

Thomas Belser 28. Dezember 2010

Hi, die Datei wird einfach per include oder in diesem Fall wie im Code oben gezeigt über die PHP-Funktion require_once eingebunden:

require_once ‚facebook.php‘;

Michael Kania 5. Januar 2011

Hallo Thomas,
danke für Deine Rückmeldung! Das Problem war wirklich nur, dass auf dem Server des Providers PHP4 als default-Parser eingestellt war. Mit der Umstellung auf PHP5 als default funktioniert es nun einwandfrei!

Sardinas 5. April 2011

Hallo
 
ich fand das tutorial auch klasse!!! vielen dank!!!
mir bleibt nur eine frage:
um meine daten wie zb name, vorname, email ausszulesen, muss man immer sich vorher bei facebokk einloggen?
muchas gracias im voraus
ariane

Thomas Belser 5. April 2011

Hi,

richtig, damit man auf deine Facebook-Daten zugreifen kann, musst du eingeloggt sein oder zu ziehst dir die Benutzerdaten einmalig aus dem Facebook-Profil in eine eigene Datenbank und liest sie dann von dort aus.

Sebastian 21. April 2011

Hi, erstmal vielen Dank für die Beschreibung.
Wenn ich die Anwendungsseite aufrufe, wird diese ständig aktualisiert. Es wird dann auch nichts angezeigt. Wenn ich im Quellcode „‚canvas‘ => 1“ für die LoginURL raus nehme, die index.php hochlade, die Anwendung aufrufe, „‚canvas‘ => 1“ wieder eintrage und nochmals die Anwendung aufrufe, dann funktioniert es. Aber auch nur auf meinen lokalen Rechner.
Was ist falsch?

Ralf 17. Juni 2011

Hey, erstmal ein dickes Lob an dich, das ist ein super Tutorial ;)
 
Ihch ba seit kurzen das Problem das folgender Fehler kommt.
 
Fatal error: Uncaught OAuthException: Error validating access token: User …….has not authorized application ……. thrown in PFAD/facebook.php on line 543
 
Eine Ahnung warum das so ist? an der der Facebook.php habe ich nicht geändert

 
Hoffe auf Antwort

Johannes H. 20. Juni 2011

Ich habe folgendes Problem:
 
Warning: require_once(base_facebook.php) [function.require-once]: failed to open stream: No such file or directory in /homepages/39/d323257720/htdocs/facebookapp/facebook.php on line 18

Fatal error: require_once() [function.require]: Failed opening required ‚base_facebook.php‘ (include_path=‘.:/usr/lib/php5′) in /homepages/39/d323257720/htdocs/facebookapp/facebook.php on line 18
 
was ist das Problem? 1&1 Server.

Thomas Belser 20. Juni 2011

Uff, hast du zufällig die neue 3er Version des PHP-SDKs verwendet? Kann sein, dass sich damit wieder einiges geändert hat und ich etliche Dinge anpassen muss. Falls ja, werde ich dies die Tage mal machen.

Johannes H. 20. Juni 2011

Habe die neuer Version verwendet. Geht es auch mit einer alten? Welche hast du genommen?

Thomas Belser 20. Juni 2011

Ich habe wie im ersten Teil des Artikels angegeben die Version 2.1.2 verwendet, welche eigentlich auch innerhalb der Quelldateien, die ich dort zum Download bereitstelle, enthalten ist. Probiere es einfach mal damit aus. :-)

Ali 4. Oktober 2011

Hallo Thomas,
vielen Dank für das tolle Tutorial.
Habe bei meiner App noch ein Problem. Ich habe es geschafft meiner App die Genehmigung zu geben. Leider wird jetzt folgendes nach dem Login angezeigt:
Anwendung ist im Umbau…
To fix this error, please set your Canvas Callback URL in the application settings editor. Once it has been set, users will be redirect to that URL instead of this page after logging in.
Kannst du mir da vielleicht weiter helfen?

mykpn.com 4. April 2013

Hallo Thomas,
ich bin ein Neuling und versuche Deine Schritte nachzuvollziehen, aber scheitere im Monet an dieser Fehlermeldung.
 
Fatal error: Class ‚Facebook‘ not found in /usr/www/users/kauche/fb/fb-anwendung/index.php on line 5

Thomas Belser 4. April 2013

Hi,

ich nehme an, dass du eine neuere Version des SDKs verwendest, welches nun grundlegend anders funktioniert. Es gab in den letzten Monaten und Jahren teils gravierende Änderungen, weshalb mein Tutorial leider nicht mehr so funktioniert wie gedacht.

Gruß, Thomas

Kommentar schreiben:


Kommentar: