facebook se reconnecter automatiquement à partir de cookie php

mon site Web utilise Facebook connect pour la connexion et la durée de la session sur mon serveur est de 3600.

j'utilise flux côté Client (javascript) rediriger vers login.php, et connectez-vous.php récupère les cookies (définis par javascript) pour obtenir le token d'accès.

cependant, si un utilisateur est ralenti sur 3600 secondes, la session sur mon serveur expire. ($_SESSION ['uid'] n'existe pas.) Comment faire pour que ma connexion.php vérifier que l'utilisateur est déjà connecté Facebook (pas mon application) ou pas?

La solution que j'utilise est de rediriger l'utilisateur vers ma page javascript, et "onStatus fonction" serait automatiquement déclenché par facebook.

je suis à la recherche d'une solution qui peut tout être fait avec login.php relogin automatiquement mon site web si il ou elle s'est connecté à Facebook (sans rediriger vers la page javascript). C'est possible?

javascript:

FB.init({appId: 'MY_APP_ID', status: true, cookie: true, xfbml: true});

FB.getLoginStatus(function(response) {
    onStatus(response);
    FB.Event.subscribe('auth.statusChange', onStatus);
    FB.Event.subscribe('auth.login', reloadPage);
});

function onStatus(response) {
    if (response.session) {
        window.location.href = '/login?fb';
    }
}

function reloadPage(response) {
    if (response.session) {
        window.location.href = '/login?fb';
    }
}

PHP (pour se connecter):

function get_facebook_cookie($app_id, $app_secret) {
  $args = array();
  if(!isset($_COOKIE['fbs_' . $app_id]))
      return false;
  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 false;
  }
  return $args;
}

$cookie = get_facebook_cookie(MY_APP_ID, MY_APP_SECRET);

if($cookie){
    if($result = @file_get_contents("https://graph.facebook.com/me/?access_token=".$cookie['access_token'])){
        $result = json_decode($result, true);
        $_SESSION['uid'] = $result['id'];
    }
3
demandé sur benck 2011-05-25 07:42:40

3 réponses

j'ai trouvé un moyen de le faire. Pour iframe la page suivante dans toutes les pages.

lorsque le token d'accès donné par facebook via cookie expire, page dans iframe auto refresh. Et FB.init () installerait un nouveau token d'accès (cookie) pour mon application.

dans Mes fichiers php, il suffit de vérifier les cookies lors de la première connexion.

fb_keepalive.html:

<div id="fb-root"></div>
<script type="text/javascript" src="https://connect.facebook.net/zh_TW/all.js"></script>
<script type="text/javascript">
FB.init({appId: 'APP_ID', status: true, cookie: true, xfbml: true});
FB.getLoginStatus(function(response) {
    onStatus(response);
});

function onStatus(response) {
    if (response.session) {
        var timestamp = new Date().getTime();
        var expires = response['session']['expires'] * 1000;
        if(expires - timestamp >= 0){
            setTimeout(function(){window.location.reload();}, expires - timestamp);
        }
    }
}
</script>
2
répondu benck 2011-05-27 13:21:34

Je suis toujours un newb à FB connect et tout ce processus mais je voulais mettre mes 2 cents. J'ai vu quelques sites strictement construits sur des utilisateurs ayant FB de sorte qu'ils étant connectés ou non à FB s'applique aux sites particuliers que je mentionne. J'ai remarqué que si je suis connecté sur FB et ont connecté avec ces sites dans le passé, alors je suis automatiquement connecté en dit le site même logique si je ne suis pas connecté.

qui dit que je suppose que cela signifie que FB a un reconnaissable cookie qui peut être détecté quelque part, où si détecté, vous pouvez probablement l'utiliser dans votre script pour obtenir les utilisateurs à être automatiquement connecté au-delà de cette marque 3600. Je sais DE twitter et linkedin qu'ils ont des jetons d'authentification d'utilisateur qui identifient chaque utilisateur qui peut finalement être stocké dans un DB et réutilisé plus tard donc je pense peut-être que vous allez vouloir examiner cela un peu plus avec FB Comme je suis sûr que ce doit être le cas avec FB aussi bien. Où vous stockez ce jeton c'est associé à un utilisateur où vous pouvez trouver que si le cookie mentionné précédemment a été trouvé, alors vérifiez pour ce token auth. Je suis désolé si cela ne fait pas beaucoup de sens Je cours sur les émanations ici. Si j'étais mieux avec les trucs FB j'essaierais d'offrir plus d'aide mais je suis dans les étapes de base de comprendre comment je peux interagir avec FB et un site non fb.

0
répondu chris 2011-05-25 09:27:30

tout en gardant le flux côté client, vous pouvez utiliser le SDK PHP Facebook ( voir sur github ) pour traiter avec la session de l'utilisateur.

$facebook = new Facebook(...);

// Get the User ID
$user = $facebook->getUser(); 

$user Non null signifie que L'utilisateur est connecté à Facebook et authentifié. Vous n'avez plus besoin du PHP que vous avez donné ici ( get_facebook_cookie et autres) : tout est inclus dans le SDK PHP Facebook. Il devrait être suffisant pour vous.


Va plus loin: si vous voulez faire des appels API pour cet utilisateur.

$user non nul ne signifie pas que vous avez un token d'accès valide pour cet utilisateur. Une façon de tester si vous avez un token d'accès valide est d'essayer de faire un appel API:

$isvalid;

try { 
  $facebook->api('/me');
  $isvalid = true;
} catch (FacebookApiException $e) {
  $isvalid = false;
}
0
répondu Quentin 2011-05-27 00:23:33