¡La victoria es mía!
Hay una función de Facebook casi totalmente indocumentada que trata sobre sesiones iframe, a la que encontré una vaga referencia en mi investigación. Sin embargo, esta página realmente no lo explica bien, y solo después de varias horas de ver varias claves de sesión en mi iframe pude averiguar qué estaba pasando.
Anteriormente, mi aplicación iframe recibía la ronda habitual de fb_whateverparámetros cuando se producía la carga inicial del iframe. Entonces, en mi solicitud, estaba haciendo esto en cada solicitud:
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'];
Este código recibiría la fb_sig_session_keycarga inicial de la aplicación, y lo arrancaría a un local $_SESSIONpara usarlo con la API. Almacenarlo en la sesión local es necesario, porque fb_sig_session_keynunca se vuelve a pasar a menos que recargue todo el iframe de la aplicación.
Entonces, los problemas ocurrieron cuando esta clave de sesión expiró una hora más tarde.
Después de mirar la página de referencia vaga , comencé a examinar todas las $_REQUESTvariables que estaba obteniendo. Resulta que incluso en un enlace interno dentro de su aplicación iframe, Facebook modifica la solicitud para pasar algunos parámetros. Por alguna razón, tienen una clave de sesión completamente diferente, pero también válida , que viene junto con cada solicitud de iframe.
Este parámetro lleva el nombre de la clave de la aplicación Facebook. Entonces, si la clave de su API de aplicación es "xyz123", cada solicitud dentro de su iframe recibe un parámetro llamado xyz123_session_key(así como algunos otros, como xyz123_expiresy xyz123_user).
Después de ver el tiempo de caducidad asociado para la sesión principal (el original fb_sig_session_key) y esta sesión de solo iframe ( xyz123_session_key), apareció la luz al final del túnel: el tiempo de caducidad de la clave de sesión solo de iframe en realidad se actualiza ocasionalmente . No he determinado cuándo ni cómo (supongo que es un ping de Ajax en algún momento), pero no obstante, se actualiza.
Esperé fb_sig_session_keya que expirara la sesión original y, por supuesto, las páginas relacionadas con amigos en mi aplicación comenzaron a generar errores. En ese momento, cambié mi clave de sesión almacenada localmente al nuevo iframe-only xyz123_session_keyy el problema fue resuelto. ¡Esa sesión funciona tan bien como la original!
Entonces, mi última corrección de código es almacenar la clave de sesión localmente de la siguiente manera:
$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'];
Esto le da preferencia a la tecla "iframe-only".
Editar: Mi suposición original de que la clave "iframe-only" se actualizó a través de algún tipo de método Ajax fue incorrecta, resulta que estos valores están configurados en una cookie por Facebook. Esto lleva a algunos problemas entre dominios al usar estas cookies. Establecer una política de cookies P3P lo aliviará con la mayoría de los navegadores, excepto Safari. Todavía no hay un buen trabajo para Safari.