לחץ כאן לצפייה בדוגמא http://ronen.tsamir.net/examples/facebookConnect.php
מאמר זה נועד לאלה שמשתמשים ישירות בגרף API של פייסבוק ללא קוד תיווך, שכן השימוש בגרף API הוא מאוד נוח ואין שום צורך לסרבל עם קוד ביניים מה עוד הגמישות בשימוש נפגעת. מה עוד ש Facebook לוקחת לעצמה את החירות לשנות את ה API ואת כללי השימוש בו מפעם לפעם וה APIs שבנויים עליו לא תמיד מדביקים את הקצב.
מי שלא מכיר עדיין את הפייסבוק גרף API מוזמן לעיין בהסבר הפשוט והקריא שפייסבוק מספקים פה: http://developers.facebook.com/docs/reference/api/
כפי שיודע כל מי שמשתמש בגרף API ישירות, כל שאנחנו צריכים הוא קוד ל access_token, בעזרתו נוכל לקבל נתונים מפייסבוק. הסיבה העיקרית לכך היא שבהסבר שפייסבוק מספקת לצירת אתרים מקושרים http://developers.facebook.com/docs/guides/web/#personalization היא מראה כיצד לעשות זאת על ידי טעינה חוזרת של הדף.
הקוד הבא לקוח מהדוגמא שמופיעה בדוקומנטציה של פייסבוק.
Using actionscript3 Syntax Highlighting
//צד שרת
<?php
// הכנסת מזהה האפליקציה
define('YOUR_APP_ID', 'your app id ');
define('YOUR_APP_SECRET', 'your app secret');
// הפונקציה שיודעת למצא את העוגיה של פייסבוק לפי מזהה האפליקציה
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);
//access_token שימוש בגרף בכדי לקבל את נתוני המשתמש מפייסבוק. וזה על ידי הוצאת ה
$user = json_decode(file_get_contents(
'https://graph.facebook.com/me?access_token=' .
$cookie['access_token']));
// צד לקוח
?>
<html>
<body>
// אם קיימת עוגיה כלומר אנחנו מחוברים לפייסבוק, אזי תציג לנו את נתוני המשתמש. אחרת תראה כפתור התחברות.
<?php if ($cookie) { ?>
Welcome <?= $user->name ?>
<?php } else { ?>
<fb:login-button></fb:login-button>
<?php } ?>
// נשאיר מקום לכל מיני דיאלוגים שפייסבוק תציג לנו בהתחברות ובכלל.
<div id="fb-root"></div>
//javaScript SDK נטען את ה
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
// פונקציית ההתחברות עליה נרחיב בהמשך.
FB.init({appId: '<?= YOUR_APP_ID ?>', status: true,
cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', function(response) {
window.location.reload();
});
</script>
</body>
</ht ml>
</script>
<?php
// הכנסת מזהה האפליקציה
define('YOUR_APP_ID', 'your app id ');
define('YOUR_APP_SECRET', 'your app secret');
// הפונקציה שיודעת למצא את העוגיה של פייסבוק לפי מזהה האפליקציה
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);
//access_token שימוש בגרף בכדי לקבל את נתוני המשתמש מפייסבוק. וזה על ידי הוצאת ה
$user = json_decode(file_get_contents(
'https://graph.facebook.com/me?access_token=' .
$cookie['access_token']));
// צד לקוח
?>
<html>
<body>
// אם קיימת עוגיה כלומר אנחנו מחוברים לפייסבוק, אזי תציג לנו את נתוני המשתמש. אחרת תראה כפתור התחברות.
<?php if ($cookie) { ?>
Welcome <?= $user->name ?>
<?php } else { ?>
<fb:login-button></fb:login-button>
<?php } ?>
// נשאיר מקום לכל מיני דיאלוגים שפייסבוק תציג לנו בהתחברות ובכלל.
<div id="fb-root"></div>
//javaScript SDK נטען את ה
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
// פונקציית ההתחברות עליה נרחיב בהמשך.
FB.init({appId: '<?= YOUR_APP_ID ?>', status: true,
cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', function(response) {
window.location.reload();
});
</script>
</body>
</ht ml>
</script>
Parsed in 0.038 seconds, using GeSHi 1.0.8.4
אז מה היה לנו כאן?
בהתחלה בצד שרת בשפת PHP בודקים האם יש עוגיה (cookie) של פייסבוק המתאימה לאפליקציה שלנו. אם כן אז יופי טופי ואין בעיה אנחנו יכולים להוציא את ה access_token המיוחל ויש לנו גישה לכל מידע והפעולות שאפליקציה שלנו קיבלה הרשאה אליהם. אבל אם לא...
למעשה ברגע שנבקש להתחבר יופעל קטע הקוד הבא.
Using actionscript3 Syntax Highlighting
<script type="text/javascript">
FB.init({appId: '<?= YOUR_APP_ID ?>', status: true,
cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', function(response) {
window.location.reload();
});
</script>
FB.init({appId: '<?= YOUR_APP_ID ?>', status: true,
cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', function(response) {
window.location.reload();
});
</script>
Parsed in 0.030 seconds, using GeSHi 1.0.8.4
ניתן לראות שבפונקציה החוזרת מהקריאה ל login מתבצע ()window.location.reload וזה בעצם מה שיוצר את הטעינה מחדש של הדף.
וזה למה? מכיוון שעכשיו נשתלת עוגיה. ובטעינה מחדש צד השרת ימצא אותה ושוב הכל כמעט יופי.
הדרך להתגבר על כך היא לקרא לפונקציה משלנו כלומר:
Using actionscript3 Syntax Highlighting
FB.Event.subscribe('auth.login',function(response) {onlogin(response);})
Parsed in 0.029 seconds, using GeSHi 1.0.8.4
לאובייקט response שאותו אנו מעבירים לפונקציה onlogin יש תיעוד שגוי במסמכים של Facebook (לפחות בפעם האחרונה שבדקתי). מחקר קטן מגלה שיש לו שדה בשם session ובתוכו שדה בשם access_token ובא לציון גואל (-:
הנה קטע הקןד שמוציא את ה access_token מתוך ה response
Using actionscript3 Syntax Highlighting
function onlogin(response)
{
alert(response.session.access_token)
}
Parsed in 0.030 seconds, using GeSHi 1.0.8.4
לסיכום.
הראתי שבעזרת שינוי קל בפונקצייה החוזרת מהקריאה ל Login נוכל להמנע מהעידכון של הדף.
בדוגמא שלי - http://ronen.tsamir.net/examples/facebookConnect.php אני מעביר את כל האובייקט לאפליקציית פלאש, מוציא את ה access_token ומשתמש בו מתוך הפלאש. אפשר כמובן לשלוח את ה access_token לשרת או להשתמש בו מתוך JavaScript
חדשות