2012-08-30 11 views
8

Intento conseguir extendieron token de acceso de larga vida conObtener token de acceso de larga vida con setExtendedAccessToken() devuelve de corta duración símbolo

$facebook->setExtendedAccessToken(); 
$access_token = $facebook->getAccessToken(); 

Después de mirar SDK me encontré con que la función setExtendedAccessToken() es la creación de larga vida token de acceso en

protected static $kSupportedKeys = 
array('state', 'code', 'access_token', 'user_id'); 

con

$this->setPersistentData(
    'access_token', $response_params['access_token'] 
); 

y getAccessToken() regresa token de acceso de corta duración de

protected $accessToken 

así que lo que es el propósito de setExtendedAccessToken() ya que no devuelve nada?

+0

También espero que alguien podría dar una respuesta útil a esa pregunta. –

Respuesta

12

@Julian. Muchas gracias por la inspiración aquí. Pude hacer que esto funcionara sin cambiar ninguno de los archivos básicos FB api.

Lo que ocurre es que la llamada setExtendedAccessToken envía el valor a setPersistentData que luego lo envía a la sesión a través del constructSessionVariableName.

Así que si lo sacamos de la sesión, y luego lo configuramos en el objeto facebook, estamos listos.

Aquí está mi código:

// ask for the extended token and get it from session ... 
$facebook->setExtendedAccessToken(); 
$access_token = $_SESSION["fb_".FB_APP_ID."_access_token"]; 
// now set it into the facebook object .... 
$facebook->setAccessToken($access_token); 
// now our fb object will use the new token as usual ... 
$accessToken = $facebook->getAccessToken(); 
+0

¡Agradable, gracias por la solución más ordenada! Me alegro de poder ayudar. –

+0

¿Tiene una versión de navegador cruzada para esto? esa sesión no se establece a veces, por ejemplo, usando Mac OSX Opera – Davit

5

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.

+0

Julian H.Parece que Lam funciona cuando no uso el facebook chrome, tal vez querían que funcione con páginas web que usan Facebook y no con las aplicaciones web que se muestran dentro de fb crome. – alexl

Cuestiones relacionadas