Facebook séance Actualisation d'une application iframe

voix
13

J'ai une application iFrame Facebook qui est complètement externe. Par là, je veux dire qu'une fois qu'un utilisateur accède à l'URL de la toile pour charger l'application, tous les liens dans l'application iframe vont à mes serveurs, et la page de toile ne fait jamais rafraîchies à moins que l'utilisateur accède à un autre endroit sur Facebook et revient (ou fait un rafraîchissement du navigateur).

Sur la charge initiale de l'application Facebook où crée l'iframe, je suis passé tous les paramètres habituels comme fb_sig_user qui me permet de créer une session d'application interne basée sur l'utilisateur facebook. Cette session de l' application (qui est pas la session Facebook, il est ma propre séance d'application) est tout ce que je dois permettre à l'utilisateur de travailler avec l'application.

Le problème vient d'une heure plus tard. Si l'utilisateur quitte l'ordinateur, ou utilise l'application pour plus d'une heure, la session Facebook expire. Il y a quelques pages d'applications qui nécessitent l'extraction des informations d'ami, et une fois la session de FB a expiré, ces pages briser, jeter des erreurs telles que « Erreur: clé de session invalide ou plus valide ».

Ma question est de savoir s'il y a un moyen de rafraîchir la session Facebook à partir d'une application iframe de l'utilisateur de le garder d'expirer une heure plus tard. Effectuez l'une des appels API font? Y at-il une astuce Facebook Connectez-vous à un ping quelque chose? Est-il une méthode définitive pour le maintenir en vie? Je ne l'ai pas été en mesure de trouver des exemples qui traitent expressément.

Créé 07/05/2009 à 18:38
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
21

La victoire est mienne!

Il y a une fonctionnalité Facebook en situation irrégulière presque entièrement traiter des séances iFrame, que j'ai trouvé une vague référence à mes recherches. Cette page n'explique pas vraiment bien cependant, et seulement après plusieurs heures de regarder différentes clés de session dans mon iframe ai - je pu comprendre ce qui se passait.

Auparavant, mon application iframe recevait le tour des habituels fb_whateverparamètres lorsque la charge iframe initiale a eu lieu. Donc , dans ma demande, je faisais cela à chaque demande:

if (isset($_REQUEST['fb_sig_session_key'])) {
    $_SESSION['fb_sig_session_key'] = $_REQUEST['fb_sig_session_key'];
}
if (! empty($_SESSION['fb_sig_session_key'])) $this->facebook->api_client->session_key = $_SESSION['fb_sig_session_key'];

Ce code recevrait le fb_sig_session_keysur la charge initiale de l' application, et je l' écureuil loin dans ce local $_SESSIONpour être utilisé avec l'API. Le stockage dans la session locale est nécessaire, parce que fb_sig_session_keyn'est jamais passé à nouveau à moins que vous rechargerez l'application entière iframe.

Ainsi, les problèmes sont survenus lorsque cette clé de session a expiré une heure plus tard.

Après avoir regardé la page de référence vague , j'ai commencé à examiner toutes les des $_REQUESTvariables que je recevais. Il se trouve que même sur un lien interne dans votre application iFrame, Facebook modifie la demande de transmettre certains paramètres. Pour une raison quelconque, ils ont un tout autre, mais aussi valide clé de session qui vient avec chaque demande iframe!

Ce paramètre est le nom de votre application Facebook clé api. Donc , si votre clé API d'application est « xyz123 », chaque demande à l' intérieur de votre iframe obtient un paramètre appelé xyz123_session_key(ainsi que quelques autres, comme xyz123_expireset xyz123_user).

Après avoir regardé le temps d'expiration associée pour la session principale (l'original fb_sig_session_key) et cette session iframe seule ( xyz123_session_key), la lumière au bout du tunnel est apparu: la clé de session iframe seule heure d' expiration se fait jour de temps en temps . Je n'ai pas déterminé quand ni comment (je suppose que c'est un ping Ajax à un moment donné), mais néanmoins, il rafraîchit.

J'ai attendu l'original fb_sig_session_keyséance d'expirer, et bien sûr les pages liées amis-dans mon application commencé à tousser des erreurs. À ce moment - là, je suis passé ma clé de session stocké localement à la nouvelle iframe seule xyz123_session_key, et le problème a été résolu. Cette session fonctionne aussi bien que l'original!

Donc, mon code final solution est de stocker la clé de session comme suit au niveau local:

$iframeSessionKeyName = $CONFIG['facebook']['apiKey'] . '_session_key';
if (isset($_REQUEST[$iframeSessionKeyName])) {
    $_SESSION['fb_sig_session_key'] = $_REQUEST[$iframeSessionKeyName];
}
else if (isset($_REQUEST['fb_sig_session_key'])) {
    $_SESSION['fb_sig_session_key'] = $_REQUEST['fb_sig_session_key'];
}
if (! empty($_SESSION['fb_sig_session_key'])) $this->facebook->api_client->session_key = $_SESSION['fb_sig_session_key'];

Cela donne la préférence à la clé « iframe seule ».

Edit: Mon hypothèse originale que la « iframe seule » clé a été mis à jour par une sorte de méthode Ajax a eu tort, il se trouve ces valeurs sont définies dans un cookie par Facebook. Cela conduit à des problèmes inter-domaines lors de l' utilisation de ces cookies. Définition d' une politique de cookie P3P allégera cela avec la plupart des navigateurs, à l' exception Safari. Il n'y a toujours pas de bon travail autour de Safari.

Créé 08/05/2009 à 00:32
source utilisateur

voix
2

Il suffit de mettre

header('P3P: CP="CAO PSA OUR"');

en haut de votre page et vous ne perdrez pas votre session dans le iframe.

J'ai aussi fait remarqué que ce fil est bon 2 et demi ans. Je viens trébuché à travers utilise Google. Peut-être que mon post va aider quelqu'un d'autre qui vient à travers cela.

Créé 28/01/2012 à 11:46
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more