Actualización de una sesión de Facebook desde una aplicación iframe

votos
13

Tengo una aplicación de iframe de Facebook que es completamente externa. Con esto quiero decir que una vez que un usuario accede al canvas URL para cargar la aplicación, todos los enlaces en la aplicación iframe van a mis servidores, y la página de canvas nunca se actualiza a menos que el usuario navegue a otro lugar en Facebook y regrese (o se actualiza el navegador).

En la carga inicial de la aplicación donde Facebook crea el iframe, me pasan todos los parámetros habituales como fb_sig_user, lo que me permite crear una sesión de aplicación interna basada en el usuario de Facebook. Esta sesión de la aplicación (que no es la sesión de Facebook, es mi propia sesión de aplicación) es todo lo que necesito para permitir que el usuario trabaje con la aplicación.

El problema llega una hora más tarde. Si el usuario abandona la computadora o usa la aplicación durante más de una hora, la sesión de Facebook caducará. Hay algunas páginas de aplicaciones que requieren recuperar información de amigos, y una vez que la sesión de FB expiró, estas páginas se rompen, arrojando errores como Error: la clave de sesión no es válida o ya no es válida.

Mi pregunta es si hay una manera de actualizar la sesión de Facebook del usuario desde una aplicación de marco flotante para evitar que caduque una hora más tarde. ¿Alguna de las llamadas API hace esto? ¿Hay un truco de Facebook Connect para hacer ping a algo? ¿Hay algún método definitivo para mantenerlo vivo? No he podido encontrar ningún ejemplo que aborde específicamente esto.

Publicado el 07/05/2009 a las 18:38
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
21

¡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.

Respondida el 08/05/2009 a las 00:32
fuente por usuario

votos
2

Sólo hay que poner

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

en la parte superior de la página y que no perderá su sesión en el iframe.

También me di cuenta de que este hilo es un buen año 2 y medio de edad. Me tropecé a través de Google está utilizando. Tal vez mi post va a ayudar a alguien que viene a través de este.

Respondida el 28/01/2012 a las 11:46
fuente por usuario

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