Acceso fuera de línea a Facebook paso a paso

ACTUALIZACIÓN : el permiso offline_access Facebook está en desuso. Por favor, consulte la documentación oficial para más información.
Tendrás hasta el 1 de mayo de 2012 , fecha en la que se desactivará esta configuración. consulte la Hoja de ruta del desarrollador para obtener más información.


Después de buscar literalmente 1 día en Facebook y Google para obtener una forma actualizada y funcional de hacer algo aparentemente simple:

Estoy buscando una explicación paso a paso para obtener offline_access para un usuario de una aplicación de Facebook y luego usar esta (clave de sesión) para recuperar datos de perfiles y amigos sin conexión y dentro de un navegador.

Preferentemente haciendo esto en la API Java de Fb.

Gracias.

Y sí, revisé la wiki de Facebook.

Actualización: ¿Alguien?

esto: http://www.facebook.com/authorize.php?api_key=&v=1.0&ext_perm=offline_access me da acceso offline, sin embargo, ¿cómo recuperar la session_key?

¿Por qué no puede Facebook simplemente hacer documentación simple, quiero decir que hay como 600 personas trabajando allí?

La pregunta aparentemente similar: Cómo obtener acceso offline para trabajar con Facebook No responde cómo recuperar la clave de sesión

Editar: Todavía estoy atrapado con eso. Creo que nadie realmente probó el acceso por lotes todavía …

Con la nueva API Graph de Facebook, las cosas se pusieron un poco más simples pero mucho menos documentadas. Esto es lo que hice para poder cargar mis publicaciones en la pared como yo desde una secuencia de comandos php solo del lado del servidor (no parte de una sesión del navegador):

  1. crea una aplicación de Facebook, si aún no tienes una que se pueda usar para este proyecto http://www.facebook.com/developers/apps.php#!/developers/createapp.php – ¡y configura el modo de sandbox / desarrollador! @ Configuración avanzada> Modo Sandbox> Habilitar (permite que solo los desarrolladores de su aplicación lo vean). Necesitará la ID de aplicación (APP_ID) y la clave secreta (SECRET_KEY) que figuran en el resumen de la cuenta de desarrollador de esa aplicación, pero no el antigua clave de API.

  2. cargue en su navegador, ya ha iniciado sesión en fb la cuenta a la que desea conectar su aplicación de servidor, y haga clic en “permitir” los permisos solicitados: https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.facebook.com/connect/login_success.html

  3. copie el parámetro “código” de la cadena de consulta de la url resultante, utilícelo en: https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&client_secret=APP_SECRET&code=CODE_FROM_2 Y copie el lado derecho de access_token = en el texto de la página resultante, que estará en la estructura de: APP_ID | HEXNUM-USER_ID | WEIRD_KEY

  4. ahora descargue ya sea desde la API gráfica o la API clásica de reposo usando el token de acceso de juramento que acaba de obtener a la vista (donde SOURCE_ID es la identificación de Facebook para el usuario / grupo / lo que está buscando):

     < ?php $stream = json_decode(file_get_contents("https://api.facebook.com/method/stream.get?source_ids=SOURCE_ID&access_token=ACCESS_TOKEN&format=json")); var_dump($stream); // this one gives a 500 internal server error from the http get if any of the fields are invalid, but only in php, not when loaded in a browser... weird. $feed = json_decode(file_get_contents("https://graph.facebook.com/SOURCE_ID/feed?fields=id,from,created_time,link,type&access_token=ACCESS_TOKEN")); var_dump($feed); ?> 

Observando que la api de gráficos y la API de reposo no solo devuelven diferentes estructuras, sino también información diferente, así que prefiero los resultados de la api de reposo (la primera) aunque me gusta poder restringir los campos en el nuevo gráfico api (el segundo).

Consulte http://developers.facebook.com/docs/authentication/ en las secciones “Solicitud de permisos extendidos” y “Autenticación de usuarios en una aplicación web” para conocer los detalles oficiales (dispersos).

Si desea hacer esto de manera rutinaria, es decir, programáticamente, aquí está la versión automatizada de los pasos 2 y 3:

Pon esto en tu servidor web como “facebook_access_token.php”:

 < ?php $token = explode('=', file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://$_SERVER[SERVER_NAME]$_SERVER[PHP_SELF]&client_secret=APP_SECRET&code=" . (get_magic_quotes_gpc() ? stripslashes($_GET['code']) : $_GET['code']))); echo $token[1]; // store this, the access token, in the db for the user as logged in on your site -- and don't abuse their trust! ?> 

Y dirija a los usuarios en sus navegadores a: https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.example.com/facebook_access_token.php

Si finalmente quiere usar PHP, con Facebook PHP SDK v3 ( vea en github ), es bastante simple. Para registrar a alguien con el permiso offline_access , solicítelo cuando genere la URL de inicio de sesión. Aquí es cómo lo haces.

Obtener el token de acceso sin conexión

Primero, verifica si el usuario está conectado o no:

 require "facebook.php"; $facebook = new Facebook(array( 'appId' => YOUR_APP_ID, 'secret' => YOUR_APP_SECRET, )); $user = $facebook->getUser(); if ($user) { try { $user_profile = $facebook->api('/me'); } catch (FacebookApiException $e) { $user = null; } } 

Si no lo está, genere la URL “Iniciar sesión con Facebook” solicitando el permiso offline_access :

 if (!$user) { $args['scope'] = 'offline_access'; $loginUrl = $facebook->getLoginUrl($args); } 

Y luego muestra el enlace en tu plantilla:

 < ?php if (!$user): ?> Login with Facebook < ?php endif ?> 

Luego puede recuperar el token de acceso sin conexión y almacenarlo. Para obtenerlo, llama:

 if ($user) { $token = $facebook->getAccessToken(); // store token } 

Usa el token de acceso sin conexión

Para usar el token de acceso sin conexión cuando el usuario no está conectado:

 require "facebook.php"; $facebook = new Facebook(array( 'appId' => YOUR_APP_ID, 'secret' => YOUR_APP_SECRET, )); $facebook->setAccessToken("..."); 

Y ahora puedes hacer llamadas a la API para este usuario:

 $user_profile = $facebook->api('/me'); 

Espero que ayude !

Hice un tutorial no hace mucho tiempo en mi blog. No requiere ningún plugin o lo que sea, está hecho en PHP, y lo he probado. Lo hice principalmente para publicaciones en el muro, pero después de que te autenticas puedes usar la función que quieras.

EDITAR: La publicación ya no existe. FB API se actualiza de todos modos …

Desea comenzar leyendo la sección Flujo del lado del servidor en la guía de autenticación. Básicamente, comienza con esta URL:

 https://www.facebook.com/dialog/oauth 

Agregue el ID de su aplicación ( disponible aquí ) a la URL, que en el lenguaje OAuth es client_id :

 https://www.facebook.com/dialog/oauth?client_id=184484190795 

Agregue el permiso o el scope offline_access en el lenguaje OAuth:

 https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access 

Agregue un redirect_uri que es a donde redirigirá Facebook después de que el usuario complete el paso de autorización (“Permitir” o “No permitir”, consulte los documentos para el formato de respuesta o simplemente pruébelo):

 https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access&redirect_uri=https%3A%2F%2Ffbrell.com%2Fecho 

Si sigue el enlace de arriba , lo llevará a un aviso, y luego al hacer clic en Permitir / No permitir, lo llevará a una página que “echos” respaldará la solicitud. Si hace clic en Permitir, obtendrá un parámetro de code atrás, que puede intercambiar por access_token al hacer una solicitud HTTP a Facebook desde su servidor, lo que hace algo como esto:

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

Necesitas pasar tu client_id , el secreto de la aplicación debe pasarse como client_secret , el mismo redirect_uri que client_secret antes y el code que recibiste como respuesta. Esto devolverá el offline_access habilitado access_token para ese usuario.

Sin embargo, una cosa a tener en cuenta es que, incluso si solicita offline_access su aplicación debe manejar con gracia las access_tokens inválidas o caducadas, ya que esto puede suceder por varias razones.

Conozco dos soluciones: Java y JavaScript

Java: a. código de servlet (no olvide importar los jar relevantes):

 String url="http://www.facebook.com/login.php?api_key=YOUR_API_KEY&v=1.0"; url+="&fbconnect=true&return_session=true&req_perms=offline_access,status_update"; url+="&next=http://YOUR_FaceBookCallback_SERVLET"; response.sendRedirect(url); return; 

// Recibirá un aviso para iniciar sesión en Facebook y permitir los permisos extendidos

segundo. No olvide definir su ConnectUrl (en su aplicación de cuenta de Facebook) como http: // YourUrlFromWhereDoYouTurnToTheServletAbove

do. hacer otro servlet: YOUR_FaceBookCallback_SERVLET (ver arriba) con este código:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String session = request.getParameter("session"); //from this string you can obtain your infinite session_key.In order to do this, parse this string as JSON. //Save it in the database or in the other data storage response.sendRedirect(ThePlaceThatYouWant);} 

re. Usa esta session_key secreta así:

 FacebookXmlRestClient client = new FacebookXmlRestClient(YOUR_API_KEY, FACEBOOK_APPLICATION_SECRET,SECRET_SESSION_KEY); client.setIsDesktop(false); client.users_setStatus("YourMessage"); 

Si alguien quiere la solución de JavaScript (el gran agujero en la seguridad) escríbeme

Descubrí cómo “recuperar” la clave de sesión infinita de acceso sin conexión después de una gran cantidad de pelos de punta, algunos de prueba y error y preguntándome sobre todas las otras maneras productivas en que podría haber pasado ese tiempo … acordar la documentación de Facebook podría ser mucho mejor

1) Si está usando facebook-java-api … eche un vistazo al sitio de demostración de Facebook para “web móvil” sobre cómo formatear la URL para solicitar acceso sin conexión
http://itsti.me/index.php

 Connect 

2) En cuanto a cómo obtener la clave de sesión fuera de línea de la sesión … El truco es: cuando Facebook redirige al usuario a la url “siguiente” justo después de otorgar acceso sin conexión, debe obtener la sesión de Facebook “nuevamente” … esta nueva sesión tendrá la clave de sesión infinita.
aquí hay un ejemplo para la web móvil … usted debería poder resolverlo para un sitio web regular. La auth_token se usa solo para sitios web móviles. Puede que no la necesite para un sitio web normal.

 FacebookJsonRestClient fbc = new FacebookJsonRestClient(MY_API_KEY, SECRET, sessionKey); String auth_token = request.getParameter("auth_token"); System.out.println("infinite session kEY = " + fbc.auth_getSession(auth_token)); 

Para el acceso a la sesión, tuve que usar el loginurl proporcionado por facebook php api, ya que parece haber 2/3 variables adicionales que envía en la solicitud de autenticación, incluyendo return_session y session_version. Además, el nuevo php5-sdk envía la solicitud a login.facebook.com en lugar de a https://graph.facebook.com/oauth/authorize . Así es como lo resolví:

$b=new facebook(array('appId'=>APP_ID,'secret'=>SECRET))

Para solicitar la autenticación:

$facebook->getLoginUrl(array('next'=>$redirect_uri,'req_perms'=>$scope))

Rember para incluir offline_access en $ scope. Una vez que se le redirige a esta página (después de iniciar sesión en fb y otorgar permisos), tendrá $ _GET [‘session’] en formato json.

Simplemente guárdelo donde desee (lo hago en una base de datos). La próxima vez que desee hacer algo con la cuenta del usuario, solo use lo siguiente:

$session = json_decode($db->query("SELECT ..."));//get session from db $this->facebook->setSession($session);

Después de esto, cualquier solicitud que realice la API se realizará a través del acceso de este usuario.

Lo peor de la API actual de Facebook es (corríjame si me equivoco) que la API actual omite la sesión (que parece ser un rest de la antigua API) en toda su documentación y solo habla de access_token. Pero la API actual (php5-sdk) no tiene ninguna función para enviar una solicitud real usando solo access_token. Si hay una función para iniciar una sesión en una sesión usando solo access_token, no estoy al tanto.