יצירת facebook connect ללא טעינה מחדש של האתר.

פורום זה יאגד בתוכו מאמרים ומדריכים בנושאים השונים שיכתבו על ידי חברי הקהילה. המאמרים יקבלו תיוג מילות מפתח, דירוג רמת קושי ודירוג הקהילה. תוכלו למצוא פה מדריך פלאש, ActionScript, MXML, מאמר בנושא תלת מימד, עיצוב, צד שרת וגם Mobile.

יצירת facebook connect ללא טעינה מחדש של האתר.

הודעהעל ידי רונן צמיר ב 02 נובמבר 2011, 18:27

אחד הדברים הבעייתיים ביצירת חיבור של אתרים לפייסבוק הוא שלאחר הלחיצה על לחצן ההתחברות הדף נטען מחדש. לפי הדוגמאות וההסברים שמופעים בפיסבוק ניראה שמצב זה מתחייב. אבל אם חופרים קצת מתחת למכסה המנוע ניתן בקלות להמנע מהטעינה מחדש, ואת זה אנסה להסביר במאמר הזה.
לחץ כאן לצפייה בדוגמא 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 היא מראה כיצד לעשות זאת על ידי טעינה חוזרת של הדף.

הקוד הבא לקוח מהדוגמא שמופיעה בדוקומנטציה של פייסבוק.


Syntax: [ Download ] [ Hide ]
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>
Parsed in 0.038 seconds, using GeSHi 1.0.8.4


אז מה היה לנו כאן?
בהתחלה בצד שרת בשפת PHP בודקים האם יש עוגיה (cookie) של פייסבוק המתאימה לאפליקציה שלנו. אם כן אז יופי טופי ואין בעיה אנחנו יכולים להוציא את ה access_token המיוחל ויש לנו גישה לכל מידע והפעולות שאפליקציה שלנו קיבלה הרשאה אליהם. אבל אם לא...
למעשה ברגע שנבקש להתחבר יופעל קטע הקוד הבא.



Syntax: [ Download ] [ Hide ]
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>
 
Parsed in 0.030 seconds, using GeSHi 1.0.8.4

ניתן לראות שבפונקציה החוזרת מהקריאה ל login מתבצע ()window.location.reload וזה בעצם מה שיוצר את הטעינה מחדש של הדף.
וזה למה? מכיוון שעכשיו נשתלת עוגיה. ובטעינה מחדש צד השרת ימצא אותה ושוב הכל כמעט יופי.

הדרך להתגבר על כך היא לקרא לפונקציה משלנו כלומר:

Syntax: [ Download ] [ Hide ]
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

Syntax: [ Download ] [ Hide ]
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
רונן צמיר
 
הודעות: 404
הצטרף: 13 מרץ 2010, 21:57
מיקום: חולון -> הרצליה פיתוח

חזור אל מאמרים ומדריכים לפלאש ומעבר

מי מחובר

משתמשים הגולשים בפורום זה: אין משתמשים רשומים ואורח אחד

cron