Después de un nuevo intento de hurgar base_facebook.php
, he descubierto lo siguiente:
setExtendedAccessToken();
intercambiarán un acceso de corta duración token y Facebook se devolver un token de acceso extendida adecuada.
setExtendedAccessToken();
guarda esto en el caché de datos persistentes, pero esto no significa que getAccessToken();
puede acceder a él, porque getAccessToken();
no consulta el caché persistente. Además, la clase parece tratar los datos persistentes como un "failsafe", y solo lo usa si todos los demás intentos de recuperación de datos han fallado (es decir, después de verificar signed_request
y analizar code
).
En nuestro caso, el token de acceso devuelto a través de setExtendedAccessToken();
es el token de acceso más reciente, así que arreglé una corrección. Agregue la siguiente línea en la parte inferior de setExtendedAccessToken();
// Also set the publically accessible access token value to this new extended token
$this->accessToken = $response_params['access_token'];
Advertencia: A pesar de que ahora tenemos el nuevo token de acceso extendida, las consultas posteriores a Facebook para recuperar un token de acceso (por ejemplo, después de una actualización de página) devolverá el mismo token de acceso de corta duración. * facepalm *
- Incluso después de que el usuario cierre la sesión (lo que hace que expire el token efímero) y vuelva a iniciar sesión, Facebook devolverá de nuevo un token de acceso efímero.
- Sin embargo, aunque este es el caso,
setExtendedAccessToken();
devolverá el mismo token de acceso ampliado que recuperó anteriormente. Este token todavía se puede usar para consultar información del usuario.
Por lo tanto, esto parece un error de Facebook, tanto como odio decirlo. Podemos solucionarlo con el truco que he detallado anteriormente, y cualquier llamada posterior para obtener un token de acceso devolverá un token de acceso de corta vida, que se puede intercambiar una y otra vez por el mismo token de acceso extendido.
respuesta original
Según this answer, el nuevo token de acceso se guarda en los datos persistentes (como también se ha indicado en su pregunta), y se puede acceder a través de $facebook->getAccessToken();
.
Dos notas relevantes:
- This page también menciona que cuando el token de acceso de corta duración se cambia por un token de acceso extendida, el token sí puede o no cambiar, aunque el tiempo de caducidad debe tener actualizado para reflejar la expiración más larga. Quizás cuando llamas al
$facebook->getAccessToken();
, simplemente estás obteniendo el mismo token, pero su vencimiento ha cambiado?
- La llamada para intercambiar un token de acceso de corta vida por una extendida solo se puede hacer una vez al día por usuario. No sé por qué sucede esto, y no sé si este contador se restablece si un usuario decide desautorizar su aplicación y volver a autorizarla.
De la documentación Facebook:
Cuando un usuario visita su sitio con un,, señal_acceso usuario de corta duración válida existente, tienen la opción de extender el tiempo de expiración de ese token de acceso. Nuestra plataforma solo ampliará el tiempo de caducidad una vez por día, por lo que incluso si un usuario revisa su sitio varias veces al día, el token se extenderá la primera vez que se solicite. (el énfasis es mío)
Creo que este es el caso, porque los programadores descuidados llamarán $facebook->setExtendedAccessToken();
en cada oportunidad posible, con la esperanza de recuperar siempre un token de acceso extendida. (En lugar del preferido, el comportamiento, que solo llamaría al $facebook->setExtendedAccessToken();
si lo que tiene actualmente es un token de acceso efímero, pero ¿cómo lo diría a menos que haya guardado la fecha de caducidad, que en sí misma no está ¡eso es confiable ...!)
Mi hipótesis es que si un usuario desautoriza la aplicación, o el token invalida de otro modo, el límite se restablecerá, y podrá recuperar una ficha de acceso ampliado una vez más al pasar un token de acceso de corta duración. Sin embargo, esto requiere más pruebas, así que tome este párrafo con un grano de sal.
También espero que alguien podría dar una respuesta útil a esa pregunta. –