2009-06-29 4 views
57

ACTUALIZACIÓN: Facebook offline_access permiso está en desuso. Consulte el official documentation para obtener más información.
Tendrá hasta el el 1 de mayo de 2012, en cuya fecha esta configuración será deshabilitada. consulte el Developer Roadmap para obtener más información.Acceso fuera de línea de Facebook paso a paso


Después de buscar literalmente a 1 día en Facebook y Google para una puesta al día y trabajo manera de hacer algo aparentemente simple:

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

Preferiblemente haciendo esto en la API Fb Java.

Gracias.

Y sí, revisé el wiki de Facebook.

Actualización: ¿Alguien?

esto: http://www.facebook.com/authorize.php?api_key=<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í?

El aparentemente misma pregunta: Getting offline_access to work with Facebook No contesta cómo recuperar la clave de sesión

Editar: Todavía estoy atascado con eso. Supongo que nadie realmente trató de un acceso de tales lotes fuera todavía ...

+11

Normalmente estoy de acuerdo con usted, pero cuando se trata de Facebook, el manual suele ser confuso y contradictorio. – Paul

+3

Estoy de acuerdo. La gente de FB necesita mejorar la documentación. Es peor que iOS y Xcode. –

Respuesta

3

sé dos soluciones: Java y JavaScript

Java: un . código del servlet (no se olvide de importar frasco de relevante):

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; 

// Usted recibirá pronta para iniciar sesión en Facebook y permitir que los permisos ampliados

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

c. hacer otro servlet: YOUR_FaceBookCallback_SERVLET (véase más 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);} 

d. Utilice esta session_key secreto de esta manera:

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 JavaScript (el gran agujero en la seguridad) escríbeme

6

no lo hice hace un tutorial demasiado 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 ...

+0

@Jon - Gracias por este tutorial. – JSchaefer

+0

Sin preocupaciones: D ¡Espero que haya ayudado a configurar algo increíble! –

+0

Utiliza el PHP PHP de Facebook heredado que ya no es válido. – Quentin

2

Descubrí cómo "recuperar" la clave de sesión infinita de acceso fuera de línea después de una gran cantidad de división de cabello, un poco de prueba y error & preguntándome sobre todas las otras formas productivas que podría haber pasado ese momento ... acuerde que 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 el URL para solicitar acceso sin conexión
http://itsti.me/index.php

<a href="http://www.facebook.com/connect/prompt_permissions.php?api_key=YOUR_API_KEY&ext_perm=publish_stream%2Coffline_access&next=http%3A%2F%2Fmysite%2Ffacebookconnect&cancel=http%3A%2F%2Fmysite%2Fhome&display=wap"><img alt="Connect" src="http://static.ak.fbcdn.net/images/fbconnect/login-buttons/connect_light_medium_long.gif" id="fb_login_image"/></a> 

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 "siguiente" url justo después de otorgar acceso fuera de línea, debe obtener la sesión de Facebook "otra vez" ... esta nueva la sesión tendrá la clave de sesión infinita.
aquí es un ejemplo para la web móvil ... usted debe ser capaz de averiguar por un auth_token website.The regularmente se utiliza sólo para los sitios web para móviles .. puede que no lo necesita 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)); 
63

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 el muro que yo desde un lado del servidor (no parte de una sesión del navegador) script PHP:

  1. crear una aplicación de facebook, si no tiene ya uno utilizable para este proyecto http://www.facebook.com/developers/apps.php#!/developers/createapp.php - ¡y configura el modo sandbox/desarrollador activado! @ 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 su cuenta de desarrollador de esa aplicación, pero no la antigua clave de API.

  2. carga en el navegador, ya registrado para fb como la cuenta que desea la aplicación del lado del servidor para conectarse como, y haga clic en "Permitir" para 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. copiar el "código" parámetro de cadena de consulta de la URL resultante, el uso que 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 copiar el lado derecho de señal_acceso = 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 el gráfico api o el cl API REST ASSIC usando el acceso juramento simbólico que acaba de recibir ala (donde SOURCE_ID es el id de facebook para el usuario/grupo/lo que sea que usted está buscando hacia arriba):

    <?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); 
    ?> 
    

Tomando nota de que la API gráfica y descanso api devuelve no solo estructuras diferentes, sino también información diferente, así que aquí, prefiero los resultados del resto de la API (la primera) aunque me gusta poder restringir los campos en la nueva API api (la segunda).

Mire 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 usted quiere hacer esto de manera rutinaria, es decir, mediante programación, aquí está la versión automatizada de pasos 2 + 3:

poner esto en su 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 usuarios directos 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

+0

Gracias me ayuda mucho. – PrateekSaluja

+0

¡Omg justo lo que estaba buscando los últimos dos días! ¡Tu eres mi salvador! – Somebody

+0

¡Impresionante! Me salvaste el día ... –

0

Para acceder 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 r eturn_session y session_version. Además, el nuevo php5-sdk envía la solicitud a login.facebook.com en lugar de https://graph.facebook.com/oauth/authorize. Así es como yo 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 en offline_access $ alcance. 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, sólo tiene que utilizar el siguiente:

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

Después de esto, todas aquellas peticiones que hace la API será a través de acceso de este usuario.

Lo peor de la API actual de API de Facebook es (corríjame si me equivoco) que la API actual omite la sesión (que parece ser un resto de la antigua API) en toda su documentación y solo habla sobre el 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.

11

Si finalmente desea utilizar PHP, con Facebook PHP SDK v3 (see on 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 la línea token de acceso

En primer lugar, comprobar si se registra el usuario 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 es, se genera la URL "Login con Facebook" pidiendo la offline_access el permiso:

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

y luego mostrar el enlace en su plantilla:

<?php if (!$user): ?> 
    <a href="<?php echo $loginUrl ?>">Login with Facebook</a> 
<?php endif ?> 

Luego puede recuperar el token de acceso sin conexión y almacenarlo.Para conseguirlo, lo llaman:

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

Utilice la línea token de acceso

Para utilizar el token de acceso fuera de línea 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 usted puede hacer llamadas a la API para este usuario:

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

Espero que ayude!

+0

Gracias por la información actualizada. – aiham

5

Quiere comenzar leyendo la sección Server Side Flow en la guía de autenticación. Básicamente, empezar con esta URL:

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

Haz tu ID de aplicación (available here) a la URL, que en OAuth jerga es client_id:

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

Añadir la jerga offline_accesspermission o scope en OAuth :

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

Añade redirect_uri que es donde Facebook se redirigirá a después de que el usuario completa el paso de autorización ("Permitir" o "No Permitir", mira a documentos de formato de respuesta o simplemente probarlo):

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

Si sigue the link above, 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, que obtendrá un parámetro code posterior, que se puede cambiar por un access_token al hacer una petición HTTP a Facebook desde el servidor, lo que hace algo a lo largo de las líneas de este:

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

Es necesario para pasar su client_id, su aplicación secreta debe pasar como client_secret, la misma redirect_uri que utilizó anteriormente y la code que recibió como respuesta. Esto devolverá el offline_access habilitado access_token para ese usuario.

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.

Cuestiones relacionadas