API de Facebook Graph: tiene token de acceso a la aplicación, necesita token de acceso del usuario sin interacción

Tenemos un sitio web de audio de blogs que se puede configurar para publicar enlaces a la línea de tiempo de Facebook del usuario cada vez que hacen una nueva entrada de blog.

Para hacer esto, tenemos al usuario que autoriza nuestra aplicación cuando configura el enlace a su cuenta de Facebook. Obtenemos los permisos publish_stream , offline_access y manage_pages (más sobre esto más adelante).

Todo el código está en C #, pero los principios se aplican a cualquier idioma, ya que estamos interesados ​​en el funcionamiento de la API de Facebook . Estamos utilizando OAuth 2 y Graph API para lograr todo esto.

Por lo tanto, obtenemos un token de acceso a la aplicación que utiliza nuestro ID de aplicación y su secreto, y utilizamos ese token para publicar en la línea de tiempo del usuario, esto funciona bien (porque ya han autorizado a nuestra aplicación para hacer esto). También podemos consultar la API de Graph y obtener sus me gusta , amigos y otros datos.

AHORA AQUÍ ESTÁ EL PROBLEMA:

Algunos de nuestros usuarios desean publicar actualizaciones a su propio tiempo y también a las líneas de tiempo de las páginas que administran. En teoría, esto es simple: usted consulta la API para las páginas que el usuario administra usando esta url: https://graph.facebook.com/{userid}/accounts?access_token={token}

Se dice que el JSON devuelto de esta llamada contiene los identificadores de página y los tokens de acceso a páginas para esas páginas. A continuación, utiliza el token de acceso a la página para publicar en las líneas de tiempo de las páginas.

Sin embargo, cuando intentamos llamar a esta URL con el token de acceso a la aplicación, obtenemos una OAuthException 102 “Se requiere un token de acceso del usuario para solicitar este recurso”.

Tenga en cuenta que esto es diferente a OAuthException 104 “Se requiere un token de acceso para solicitar este recurso” (que es lo que obtendría si se le olvidara pasar un token de acceso), y también a la OAuthException 190 “firma de token de acceso OAuth no válida” (que obtendría si el token de acceso no era válido).

Por lo tanto, nuestro token de acceso es válido, pero no es válido para esta URL en particular. Por lo tanto, parece que necesitamos un token de acceso de usuario y no un token de acceso a la aplicación para este feed en particular (hace mucho tiempo que no me importa por qué este es el caso, simplemente parece ser así).

Toda la documentación de Facebook sobre este tema (y debo haberla leído toda en este momento) lleva a un solo lugar: http://developers.facebook.com/docs/authentication/server-side/ , también conocido como “Autenticación del lado del servidor” Flujo “página. Esta página describe cómo obtener el token de acceso de usuario difícil de alcanzar al redirigir al usuario al diálogo de autenticación y solicitar los permisos relevantes, pero debemos lograrlo sin la interacción del usuario y el usuario ya ha otorgado a nuestra aplicación todos los permisos que necesitamos . Toda esta publicación automatizada ocurre del lado del servidor en el procesamiento posterior del audio, por lo que no podemos interactuar con el usuario en esta etapa de todos modos.

No lo entiendo ¿Por qué podemos usar el token de acceso de la aplicación para obtener casi todos los datos que queremos del usuario (bueno, lo que sea que nos hayan dado permiso para obtener) pero los datos de las cuentas para los que necesitamos un token de acceso diferente (usuario)?

¿Alguien puede arrojar alguna luz sobre cómo podemos obtener un token de acceso de usuario que nos permita obtener los datos / cuentas de nuestros usuarios sin ninguna interacción adicional del usuario?

Por lo tanto, nuestro token de acceso es válido, pero no es válido para esta URL en particular. Por lo tanto, parece que necesitamos un token de acceso de usuario y no un token de acceso de aplicación para este feed en particular

Debido a los permisos por tipo de token de acceso, necesita un token de acceso de usuario válido en este caso particular. Lea todo sobre los tokens y tipos de acceso . Esa es la forma como es.

Esta página describe cómo obtener el token de acceso de usuario difícil de alcanzar al redirigir al usuario al diálogo de autenticación y solicitar los permisos relevantes, pero debemos lograrlo sin la interacción del usuario y el usuario ya ha otorgado a nuestra aplicación todos los permisos que necesitamos .

Si su usuario ya ha otorgado sus permisos, ¿por qué tiene problemas entonces? Le sugiero que mantenga el token de acceso del usuario. Desde este punto final :

https://www.facebook.com/dialog/oauth?client_id=..&redirect_uri=..&state=..&scope=..&response_type=..&display=.." 

recuperas un código, como este:

 YOUR_REDIRECT_URI?code=OAUTH_CODE_GENERATED_BY_FACEBOOK&state=YOUR_STATE_VALUE 

Use este código para generar su token de acceso de usuario, como se explica aquí :

 https://graph.facebook.com/oauth/access_token?client_id=..&redirect_uri=..&client_secret=..&code=.. 

Esto resultará en una respuesta como:

 access_token=USER_ACCESS_TOKEN&expires=NUMBER_OF_SECONDS_UNTIL_TOKEN_EXPIRES 

Ahí está, su token de acceso de usuario. Persístelo. Como puede ver, expira después del valor indicado en la respuesta. Si está utilizando la nueva API, debe indicar 60 días (lo que me lleva a esto: offline_access está obsoleto y los resultados son de corta duración, válidos durante 2 horas – tokens), enlace . Cada vez que su usuario inicia sesión en su aplicación y utiliza la integración de Facebook, los tokens se actualizan nuevamente, durante 60 días. Esto significa que, si su usuario no debe iniciar sesión en su aplicación y usarla durante 60 días, caducará.

Puede verificar si el token de acceso del usuario ha caducado con:

 https://graph.facebook.com/debug_token?input_token=INPUT_TOKEN&access_token=ACCESS_TOKEN 

Si eso hace: renueve el token de acceso del usuario usando su token de acceso a la aplicación , está bien documentado aquí . Pero estoy citando esta parte:

Inicio de sesión del lado del servidor Para obtener un token de acceso nuevo [de usuario] en este caso, debe pasar al usuario nuevamente a través del flujo completo de inicio de sesión del lado del servidor. Sin embargo, suponiendo que el usuario no haya desautorizado su aplicación, cuando redirija al usuario al Diálogo de OAuth, no se le pedirá que vuelva a autorizar su aplicación y será redirigido inmediatamente a redirect_uri. Esto significa que el proceso de autenticación puede parecer razonablemente transparente para el usuario.

Línea inferior: no hay tokens de acceso de usuario que sean válidos para siempre, sin embargo, el token de acceso a la aplicación sí lo es. Persista su token de acceso de usuario y verifique si sigue siendo válido antes de realizar llamadas de API con él. Un usuario normal debe usar su aplicación dentro de los 60 días y no debe simplemente desautorizar su aplicación por diversión. Por lo tanto, el caso de uso en el que el usuario debe volver a autorizar es bastante raro, sin embargo, debe esperar.