2011-04-14 2 views
6

J'utilise avec succès le SDK Facebook (PHP) pour connecter des utilisateurs à mon site, mais j'ai des problèmes lors de l'authentification de leur compte. Leur compte est authentifié avec succès, mais pour une raison quelconque, les sessions de mon site sont effacées.Facebook API SDK (PHP) clearing sessions de site

Débit:

  • journaux utilisateur dans mon site (nom d'utilisateur et mot de passe)
  • utilisateur se connecte à Facebook dans une fenêtre contextuelle
  • Facebook authentifie l'utilisateur et retourne à mon site
  • Mes sites de session est maintenant invalide (à la fois dans la fenêtre contextuelle et la fenêtre principale) entraînant la déconnexion de l'utilisateur

J'utilise le SDK Facebook (PHP) et mon site utilise le framework CakePHP

Toute aide sera grandement appréciée.

+0

Utilisez-vous le SDK Javascript pour afficher le popup ou vous le faites manuellement? – pleasedontbelong

+0

Je le fais manuellement. Je n'utilise que le SDK PHP – bpneal

Répondre

1

Je ne pouvais pas savoir pourquoi la session était en cours de réinitialisation, donc décidé de ne pas utiliser le SDK pour l'authentification. C'est ce que j'ai utilisé à la place.

$code = (isset ($_REQUEST['code']) ? $_REQUEST['code'] : null); 

if (empty ($code)) { 
    $dialogUrl = 'http://www.facebook.com/dialog/oauth?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&scope=' . implode(',', $this->scope); 
    header('Location: ' . $dialogUrl); 
    die; 
} 
else { 
    $tokenUrl = 'https://graph.facebook.com/oauth/access_token?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&client_secret=' . $this->secret . '&code=' . $code; 
    $accessToken = file_get_contents($tokenUrl); 

    $this->Session->write('facebookAccessToken', $accessToken); 

    $graphUrl = 'https://graph.facebook.com/me?' . $accessToken; 
    $fbUser = json_decode(file_get_contents($graphUrl)); 

    if ($fbUser) { 
     ... 
    } 
} 
1

Pourrait être utile de vérifier le niveau de sécurité Cake, il pourrait faire des vérifications de référant (je pense qu'il le fait dans le "haut" paramètre, peut-être le "moyen"), ce qui invaliderait la session.

+0

Merci Griff, c'était ma première pensée mais j'ai essayé de baisser le niveau à «bas» et toujours obtenir le même problème. J'utilise aussi l'API Twitter de la même manière et cela ne produit pas la même erreur. Cela doit être quelque chose dans le Facebook SDK – bpneal

2

Je ne peux pas vous dire ce qui est supprimions votre session, mais vous pourriez vouloir essayer (fonctionne pour moi)

utiliser le SDK Javascript pour afficher les boutons de connexion qui va ouvrir la fenêtre pour se connecter à FB

ajouter le SDK js à votre page comme ceci:

<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
    FB.init({appId: '<?php echo FB_API_ID; ?>', status: true, cookie: true, xfbml: true}); 
    FB.Event.subscribe('auth.login', function() { 
     new Request({ 
      'method': 'get', 
      'url': '<?php echo $this->Html->url(array('controller'=>'users','action'=>'login_fb'));?>', 
      'onSuccess': function(result){ 
       window.location.reload();  
      } 
     }).send(); 
    }); 
    }; 
    (function() { 
    var e = document.createElement('script'); e.async = true; 
    e.src = document.location.protocol + 
     '//connect.facebook.net/en_US/all.js'; 
    document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 

en cas auth.login j'utilise un appel ajax à/utilisateurs/login_fb qui utilisera le SDK Facebook pour vérifier la session facebook:

App::import('Lib', 'facebook_sdk/facebook'); 
    // "MyAuth" is a custom Auth Component that extends the normal Auth component 
    $this->MyAuth->facebook = new Facebook(array(
     'appId' => FB_API_ID, 
     'secret' => FB_SECRET, 
     'cookie' => true, 
    )); 

    $me = null; 
    $session = $this->MyAuth->facebook->getSession(); 
    if ($session) { 
     try { 
     $uid = $this->MyAuth->facebook->getUser(); 
     $me = $this->MyAuth->facebook->api('/me'); 
     } catch (FacebookApiException $e) { 
     error_log($e); 
     } 
    } 

    if ($me) { 
     $this->Session->write('FbLogin.session',$session); 
     $this->Session->write('FbLogin.user',$me); 
     $UserModel = ClassRegistry::init('User'); 
     $user = $UserModel->findByUid($me['id']); 
     if(!$user){ 
      $UserModel->create(); 
      $user_data = array('username'=>$me['username'], 
         'name'=>$me['first_name'], 
         'lastname'=>$me['last_name'], 
         'email'=>$me['email'], 
         'group_id'=>GROUP_VISITOR, 
         'uid'=>$me['id'] 
         ); 
      $UserModel->save($user_data); 
      $user['User']['id'] = $UserModel->id; 
     } 
     $this->Session->write($this->MyAuth->sessionKey, $user['User']); 
     $this->MyAuth->_loggedIn = true; 
     } 
} 

l'idée principale est que .. en js j'appelle un ajax pour vérifier la session fb, puis l'enregistrer dans la session de gâteau, et les js actualiser la page

+0

Merci, cela semble bon mais j'ai décidé de ne plus utiliser le SDK pour l'authentification – bpneal

+0

Ceci est une approche intelligente, semble assez kool – Herr