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.