2011-11-28 3 views
0

Le cas:Comment traiter access_token expiré

  1. Nous plug-in FB JS et init avec FB.init(). Cet appel crée un cookie fbsr_NNNNN. Le cookie a une date d'expiration limitée à la session (jusqu'à ce que le navigateur soit fermé). Nous n'appelons FB.init() qu'une seule fois dans cet exemple. Après que l'on appelle les pages qui ne contiennent pas ont FB.init() invocations il n'a pas une chance de renouveler le access_token
  2. Nous effectuons l'authentification et faire de côté serveur (PHP FB SDK) appel, comme /me
  3. Wait Exécuter la demande /me à nouveau et voir "Un jeton d'accès actif doit être utilisé pour interroger des informations sur l'utilisateur actuel".

Cela se produit parce que la mise en œuvre actuelle php sdk:

public function getSignedRequest() { 
    if (!$this->signedRequest) { 
     if (isset($_REQUEST['signed_request'])) { 
     $this->signedRequest = $this->parseSignedRequest(
      $_REQUEST['signed_request']); 
     } else if (isset($_COOKIE[$this->getSignedRequestCookieName()])) { 
     $this->signedRequest = $this->parseSignedRequest(
      $_COOKIE[$this->getSignedRequestCookieName()]); 
     } 
    } 
    return $this->signedRequest; 
    } 

prend juste le access_token des biscuits comme ça, et en cas d'exception, il ne les efface pas. Le code n'a donc aucune chance de revenir au flux de travail normal sans suppression manuelle des cookies. Oui, si je supprime le cookie - le code commence à fonctionner à nouveau (tant qu'il n'y a pas de access_token enregistré et la bibliothèque récupère le nouveau).

Alors, quelle solution de contournement pour ce problème proposeriez-vous? Qu'est ce que tu utilises? Pensez-vous que c'est un bug?

UPD: il semble qu'il existe une solution de contournement possible: étendre la classe Facebook et remplacer la méthode qui nettoie les stockages persistants. Pour plus de détails regarde la discussion à la réponse http://facebook.stackoverflow.com/a/8294559/251311

Mais je suis personnellement toujours certain que doit gérer FB SDK sans hacks supplémentaires

+0

Je pense que ce post aidera dans une solution: http://developers.facebook.com/blog/post/500/ J'espère que cela vous aide –

+0

Non, il s'agit d'un autre cas. Il ne dit rien sur la gestion "Un jeton d'accès actif doit être utilisé pour interroger des informations sur l'utilisateur actuel." Et je ne veux pas réimplémenter l'OAuth manuellement, je veux juste la solution qui fonctionnera avec FB PHP SDK – zerkms

+0

Il n'y en a pas. C'est le résultat de la combinaison de PHP et JS, où PHP fait le travail en utilisant les données fournies par JS, mais sans JS pour garder les données actives. –

Répondre

1

Première: Je n'ai aucune expérience avec Facebook lui-même, mais les OAuth 2 spécifie RFC refresh_token - envisagez de l'implémenter.

Deuxième: Facebook renvoie une erreur, non? Si cette erreur se produit, il suffit de désactiver le cookie. Si cela ne fonctionne pas avec votre implémentation actuelle, vous faites quelque chose de mal - à peu près toutes les bibliothèques Twitter que j'ai vues (utilise aussi OAuth, bien que 1.0a) utilisent son propre wrapper HTTP. Plutôt que de renvoyer une URL pour vous demander de simplement exécuter la demande vous-même. Troisième: que se passe-t-il si vous définissez simplement un délai d'expiration sur le cookie? Je suis plutôt sûr que OAuth vous donne également une valeur de expires_in, il suffit de l'utiliser (prenez 5 secondes de décalage sur cette valeur, à cause du décalage réseau, etc.).

+0

'Si cette erreur survient, il suffit de désactiver le cookie', oui, mais il devrait être géré par le client expédié par facebook, shouldn ' t-il?'Troisièmement: Que faire si vous définissez simplement un délai d'attente sur le cookie?' --- le cookie est défini par FB JS, pas par mon code. – zerkms

+0

'OAuth vous donne aussi' --- oui, il le fait, mais je n'ai pas accès à cette information, car il est complètement traité par le client – zerkms

+0

Ah, le mélange JS/PHP :-) Vous avez un point cependant. ** Peut-être que vous devriez envisager d'implémenter la connexion OAuth aussi bien ** (plutôt que FB.init()) - c'est très facile à faire, surtout si vous utilisez une bibliothèque. Pour autant que je sache, la version JS conserve les données intactes pour pouvoir actualiser le jeton en cas de besoin. Si les données avaient disparu, il ne saurait jamais que la session a été créée, il doit donc la conserver, même si elle a expiré. Il suffit de saisir un nouveau jeton et 'setcookie()' –