2012-06-05 3 views
15

PROBLEMA BÁSICO: Quiero que mi aplicación pueda realizar llamadas a la API de Facebook api sobre usuarios autorizados incluso cuando el usuario está lejos.Facebook PHP SDK: obtener token de acceso "de larga vida" ahora que "offline_access" está en desuso

Por ejemplo, quiero que el usuario (A) autorice la aplicación, luego deseo que el usuario (B) pueda usar la aplicación para ver información sobre los amigos del usuario (A). Específicamente: el campo "trabajo". Sí, estoy solicitando esos permisos extendidos (user_work_history, friends_work_history, etc.). Actualmente mi aplicación tiene acceso al historial de trabajo de amigos del usuario conectado, pero no al historial de trabajo de amigos de otros usuarios de la aplicación.

Esto es lo que ya sabemos:

  • Adición offline_access al parámetro alcance es la manera antigua y ya no funciona.
  • La nueva forma es con tokens de acceso de "larga vida", descritos here. Estos duran 60 días.
  • Necesito intercambiar un token de acceso normal para obtener el nuevo token extendido. La documentación de FB dice:

    https://graph.facebook.com/oauth/access_token?
    client_id = APP_ID & client_secret = APP_SECRET & grant_type = fb_exchange_token & fb_exchange_token = EXISTING_ACCESS_TOKEN

Esto es lo que no sé (y espero que usted me puede decir): ¿Cómo Cómo obtengo el token de acceso extendido (también conocido como "de larga duración") usando Facebook PHP SDK? Actualmente, mi código es el siguiente:

$facebook->getAccessToken(); 

¿Existe tal cosa como esto ?:

$facebook->getExtendedAccessToken(); 

Si no es así, ¿es esto lo que debería hacer?

$accessToken = $facebook->getAccessToken(); 
$extendedAccessToken = file_get_contents("https://graph.facebook.com/oauth/access_token?    
    client_id={$appId}& 
    client_secret={$secret}& 
    grant_type=fb_exchange_token& 
    fb_exchange_token={$accessToken}" 
    ); 

Lo he probado y no funciona. Obtengo este error:

Warning: file_get_contents(https://graph.facebook.com/oauth/access_token? client_id=#######& client_secret=#########& grant_type=fb_exchange_token& fb_exchange_token=##########) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /... 

¿Funciona de manera diferente si cambio a FQL en lugar de la API del gráfico? He leído la documentación de Facebook muchas veces, pero el sdk de PHP no está completamente documentado y no puedo encontrar ningún ejemplo de cómo debería funcionar.

+1

ya está en la página que ha vinculado la respuesta - la leyó una vez más, con cuidado ... – CBroe

+0

Creo que sé a qué se refiere, y actualicé la pregunta para mostrar lo que probé (sin éxito). Por favor dime si estás hablando de otra cosa. – emersonthis

+0

Si está utilizando el SDK, ¿por qué usa file_get_contents? Simplemente use Facebook :: api para realizar la solicitud en la API Graph. – CBroe

Respuesta

29

Finalmente me di cuenta de esto por mi cuenta. La respuesta es bastante anticlimática. Parece que las aplicaciones creadas recientemente obtienen tokens de acceso de 60 días automáticamente. No estoy seguro de si esto depende de habilitar la configuración "privado sin conexión_acceso" en la sección Migraciones de la configuración de la aplicación. Déjalo para estar seguro.

Así que en el momento de escribir esto, se puede utilizar el SDK de PHP de la siguiente manera: $facebook->getAccessToken();

(. La razón mi aplicación no funcionaba como era de esperar no estaba relacionado con la expiración del token de acceso)

Sólo una cosa más, para conseguir el acceso de larga vida símbolo utilizando el SDK de PHP debe llamar antes $facebook->setExtendedAccessToken();$facebook->getAccessToken();

+0

Estaba usando un SDK más antiguo. No tenía la función setExtendedAccessToken que mencionaste, así que me di cuenta de que debería cambiar a la versión más nueva. Ahora funciona, gracias! – shaharsol

+2

Me estoy enojando con esto ... Tengo una duda: estás haciendo esto porque quieres acceder al perfil de usuario incluso cuando no está conectado, ¿verdad? Pero, ¿qué sucede cuando expira el token 'extendido' de 60 días? ¿El usuario necesita volver a autenticarse ...? No fue una gran experiencia, supongo ... – AldoB

+0

jajaja - Supongo que eso explica por qué todo estaba funcionando correctamente, ¡HASTA que intenté crear una NUEVA aplicación, y luego generar la ficha de eso! (Con la aplicación VIEJA, me sale sin vencimiento, con la aplicación NUEVA, ¡recibo 60 días!) – Brad

22

En la última Facebook PHP SDK 3.2.0 tiene una nueva función setExtendedAccessToken() que usted tiene que llamar antes getAccessToken();

De esta manera:

$user = $facebook->getUser(); 
$facebook->setExtendedAccessToken(); //long-live access_token 60 days 
$access_token = $facebook->getAccessToken(); 
10

aplicaciones realidad de nueva creación sólo consiguen un acceso token de 60 días de forma automática si está utilizando una llamada del lado del servidor. Si está utilizando el punto final del lado del cliente como se muestra arriba en la pregunta, incluso las aplicaciones nuevas aún recibirán inicialmente un token de corto plazo. ver: https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

Tuve el mismo error HTTP/1.1 400 Bad Request que tenía al usar el nuevo Endpoint y el problema era que si copia el código que Facebook le da exactamente y lo pega en su aplicación, en realidad hay espacios entre los parámetros, lo que significa que hay espacios innecesarios en la url y no se llamará correctamente cuando se pase a file_get_contents() aunque funcione bien cuando se pegue en el navegador. Esto me llevó demasiado tiempo para descubrirlo. Espero que esto ayude a alguien! Aquí está mi código de trabajo completo para obtener el token de acceso extendido fuera del nuevo punto final (DT de x con sus valores):

$extend_url = "https://graph.facebook.com/oauth/access_token?client_id=xxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxxx&grant_type=fb_exchange_token&fb_exchange_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 

$resp = file_get_contents($extend_url); 

parse_str($resp,$output); 

$extended_token = $output['access_token']; 

echo $extended_token; 
+0

No puedo verificar esto, pero es el primer problema que vi en la pregunta – acSlater

Cuestiones relacionadas