Ausgabe
Unten sehen Sie ein funktionierendes Beispiel für einen serverseitigen Ablauf. Es ist eine Datei fb_server_side_flow.php, die ich aus einer Vorlage erstellt habe, die ich auf developer.facebook.com gefunden habe. Meine erste Frage ist, was genau $code = $_REQUEST[“code”] ist; tun? Bekommt es ein Facebook-Cookie? Wenn ja, wie ist $code = $_REQUEST[“code”]; anders als der Code direkt darunter? Ist es wirklich notwendig, session_start ganz oben in fb_server_side_flow.php zu verwenden?
Hauptsächlich versuche ich, ein System zu implementieren, das meinem Benutzer die Möglichkeit gibt, sich über Facebook anzumelden, aber ein Login über Facebook ist keine Voraussetzung. Gibt es eine Dokumentation zur Implementierung einer Anmeldung über Facebook OPTION im Gegensatz zu einer erforderlichen Anmeldung über Facebook?
Vielen Dank!
....
function get_facebook_cookie($app_id, $app_secret) {
$args = array();
parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
ksort($args);
$payload = '';
foreach ($args as $key => $value) {
if ($key != 'sig') {
$payload .= $key . '=' . $value;
}
}
if (md5($payload . $app_secret) != $args['sig']) {
return null;
}
return $args;
}
$cookie = get_facebook_cookie(YOUR_APP_ID, YOUR_APP_SECRET);
....
fb_server_side_flow.php
<?php
$app_id = "****";
$app_secret = "****";
$my_url = "http://www.sepserver.net/dsg/fb_server_side_flow.php";
session_start();
$code = $_REQUEST["code"];
if(empty($code)) {
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$dialog_url = "https://www.facebook.com/dialog/oauth?client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
. $_SESSION['state'];
echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_REQUEST['state'] == $_SESSION['state']) {
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret . "&code=" . $code;
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$graph_url = "https://graph.facebook.com/me?access_token="
. $params['access_token'];
$user = json_decode(file_get_contents($graph_url));
echo("Hello " . $user->name);
}
else {
echo("The state does not match. You may be a victim of CSRF.");
}
?>
Lösung
Der erste Codeblock dient zum Abrufen von Facebook-Cookie-Parametern für Benutzer, die bereits autorisiert und angemeldet sind.
Der zweite Codeblock dient dazu, den Benutzer Ihre Anwendung autorisieren zu lassen (oauth) UND ein access_token abzurufen, das Ihre Anwendung verwenden kann, um API-Aufrufe (FB Graph) im Namen des Benutzers durchzuführen.
$_REQUEST bezieht sich auf POST- oder GET-Parameter, nicht auf Cookies. Wenn Sie die Dokumente zum Authentifizierungsablauf überprüfen , können Sie sehen, dass Facebook den Benutzer zu http://your_redirect_uri?code=1234abcd umleitet, nachdem der Benutzer Ihren Antrag genehmigt hat. Sie sollten sich diesen Codeparameter schnappen und ihn verwenden, um einen weiteren Aufruf an graph.facebook.com zu tätigen, um das access_token des Benutzers zu erhalten.
Der Zweck von session_start() besteht darin, das Array $_SESSION so vorzubereiten, dass $_SESSION[‘state’] beim Neuladen der Seite erhalten bleibt. Wenn Ihr Framework bereits über Session-Handling-Code verfügt, können Sie ihn weglassen. Es wird nur für das CSRF-Schutzbit verwendet.
Die optionale Anmeldung ist ziemlich einfach. Wenn Sie das neue PHP-SDK verwenden, können Sie den Rückgabewert von überprüfen $facebook->getUser();
– wenn er 0 ist, ist der Benutzer nicht angemeldet (und Sie können den Inhalt wie gewohnt anzeigen, vielleicht mit einem zusätzlichen Link zu fb_server_side_flow.php, um die Genehmigungsverfahren.)
Beantwortet von – Gigabla
Antwort geprüft von – Pedro (FixError Volunteer)