Facebook API – Teil 3
Im 3. Teil zum PHP SDK geht es um das serverseitige Auslesen von Informationen von Facebook. Dafür gibt es, wie schon im ersten Teil berichtet, zahlreiche SDKs. In diesem Artikel gehe ich dabei näher auf das PHP SDK ein, wobei sich die anderen wohl kaum stark in Funktion und Umfang unterscheiden werden.
PHP SDK
Wir haben bereits gesehen wir man beim CLient über das Javascript SDK Daten von Facebook bekommt und darstellen kann. Das funktioniert auch am Server, dafür gibt es das PHP SDK von Facebook.
Signed Request
Der Signed Request ist eine POST Variable die von Facebook mitgegeben wird, wenn sich der Benutzer an der App angemeldet hat. Ab dem Zeitpunkt kann man auch am Server freigegebene Daten vom Facebook Benutzer auslesen. Um dies festzustellen benötigen wir folgenden Code:
if(isset($_POST['signed_request'])) { $signed_request = $_POST['signed_request']; // now get userdata $data = parse_signed_request($signed_request, $fb_secret); // is facebook user fan of our site? $fan = $data['page']['liked']; // get the user id of facebook user $user_id = $data['user_id']; }
Sobald das signed request Objekt übergeben wird können wir Daten des Facebook Benutzers auslesen. Exemplarisch schauen wir hier ob der Benutzer Fan der Seite ist. Zusätzlich holen wir uns seine Facebook ID. Der oben genannte Code verwendet die parse_signed_request Funktion. Diese gibt ein Array data zurück das alle Informationen des Benutzers enthält. Als Parameter benötigt diese Funktion das signed request objekt und die Facebook Security Code der App, welche man beim Anlegen einer Facebook App neben dessen ID auch bekommt. Diese Funktion habe ich von einer externen Seite und wird hier nur der Vollständigkeit auch angegeben.
function parse_signed_request($signed_request, $secret) { list($encoded_sig, $payload) = explode('.', $signed_request, 2); // decode the data $sig = base64_url_decode($encoded_sig); $data = json_decode(base64_url_decode($payload), true); if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { error_log('Unknown algorithm. Expected HMAC-SHA256'); return null; } // Adding the verification of the signed_request below $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); if ($sig !== $expected_sig) { error_log('Bad Signed JSON signature!'); return null; } return $data; }
Facebook oder nicht Facebook?
Wie im Teil 1 beschrieben kommuniziert man über den Facebook Proxy mit der Webapplikation, auch mit dem PHP SDK. Man kann die Webapplikation aber auch ohne diesen Umweg auch direkt aufrufen. Was passiert? Die Webapplikation wird im Browser normal dargestellt, aber ohne den Facebook Rahmen. Will man das verhindern, so kann man überprüfen, ob der Benutzer über den Facebook Proxy gekommen ist. Ist dies nicht der Fall, dann kann man den Benutzer auf die Facebook App weiterleiten. Hier der Code dazu:
if (strpos($_SERVER['HTTP_USER_AGENT'], 'facebook') === false) { // we're outside of facebook // redirect user to fanpage header('Location: '.$fb_appurl); die(); }
Zuerst wird geprüft, ob in user agent der String ‚facebook‘ vorkommt. Bei einem Request über Facebook ist dies der Fall. Wird dieser String aber nicht gefunden, dann brechen wir unser Skript ab und schicken den Benutzer auf die App Seite.
Mobil oder Desktop?
Da Facebook mittlerweile auch auf mobilen Endgeräten gut vertreten ist stellt sich diese Frage auch für Entwickler. Das Problem: eine Facebook App über Facebook aufgerufen ist mit dem Facebook Rahmen etwas umständlich. Viel besser wäre es die App direkt in den 810px Breite am Handy oder Tabletdisplay darzustellen. Um so etwas zu erreichen benötigen wir 2 Dinge:
- Mobile Geräte müssen erkannt werden
- bei mobilen Geräten darf die App nicht über Facebook angezeigt werden
Um zu erkennen ob die App in einem mobilen Browser angezeigt wird, benötigen wir den schon oben benutzten user agent.
$agent = $_SERVER['HTTP_USER_AGENT']; $mobile = isMobileBrowser($agent);
Die Funktion isMobileBrowser überprüft nun ob im user agent Strings enthalten sind, welche auf einen mobilen Browser schließen lassen. Diese Funktion schaut wie folgt aus:
function isMobileBrowser($agent) { if (!$agent) return false; $mobiles = array('android','iphone','ipod','windows ce','pocket', 'mobile','portable','smartphone','sda','pda', 'handheld','symbian','wap','palm','avantgo', 'chtml','blackberry','opera mini','nokia' ); $i = 0; $max = count($mobiles); $flag = false; while ($i < $max && $flag === false) { $flag = !(strpos(strtolower($agent), $mobiles[$i]) === false); $i++; } return $flag; }
Nun weiß man ob es sich um einen mobilen oder einen Desktop Browser handelt. Jetzt brauchen wir den Benutzer nur noch auf die richtige Seite weiterleiten:
if($mobile) { // redirect to web app on server header('Location: '.$fb_serverurl); } else { // redirect to facebook app header('Location: '.$fb_appurl); } die();
Teil 1 | Teil 2 | Teil 3 | Teil 4