56 votes

Accès hors ligne à Facebook, étape par étape

UPDATE : Facebook offline_access est dépréciée. Veuillez vous référer à la documentation officielle pour plus d'informations.
Vous aurez jusqu'à 1er mai 2012 date à laquelle ce paramètre sera désactivé. Feuille de route pour les développeurs pour plus d'informations.


Après avoir cherché littéralement pendant un jour sur facebook et google pour une mise à jour et un travail manière de faire quelque chose d'apparemment simple :

Je cherche une explication étape par étape pour obtenir l'accès hors ligne d'un utilisateur pour une application facebook et ensuite utiliser cette clé de session pour récupérer les données d'amis et de profil hors ligne et non dans un navigateur.

Il est préférable de le faire dans l'API Java de Fb.

Merci.

Et oui, j'ai vérifié le wiki de Facebook.

Mise à jour : Quelqu'un ?

ceci : http://www.facebook.com/authorize.php?api_key=<api-key>&v=1.0&ext_perm=offline_access me donne offline_Access, mais comment récupérer la session_key ?

Pourquoi facebook ne peut pas faire une simple documentation, je veux dire qu'il y a 600 personnes qui travaillent là-bas ?

La même question, apparemment : Faire fonctionner l'accès hors ligne avec Facebook Ne répond pas à la question de savoir comment récupérer la clé de session.

Edit : Je suis toujours coincé avec ça. Je suppose que personne n'a encore essayé un tel accès par lot...

64voto

Chris Points 1019

Avec la nouvelle API graphique de Facebook, les choses sont devenues un peu plus simples mais beaucoup moins bien documentées. Voici ce que j'ai fait pour pouvoir charger les posts de mon mur en tant que moi à partir d'un côté serveur uniquement (ne faisant pas partie d'une session de navigateur) php script :

1) créer une application facebook, si vous n'en avez pas déjà une utilisable pour ce projet http://www.facebook.com/developers/apps.php#!/developers/createapp.php -- et activez le mode sandbox/développeur ! @ Paramètres avancés > Mode Sandbox > Activer (Permet uniquement aux développeurs de votre application de la voir.) Vous aurez besoin de l'ID de l'application (APP_ID) et de la clé secrète (SECRET_KEY) qui figurent dans le récapitulatif de votre compte de développeur pour cette application, mais pas de l'ancienne clé API.

2) Chargez dans votre navigateur, déjà connecté à fb en tant que compte sous lequel vous voulez que votre application côté serveur se connecte, et cliquez sur "autoriser" pour les permissions demandées : 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) copier le paramètre "code" de la chaîne de requête de l'url résultante, l'utiliser dans : 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 Et copiez le côté droit de access_token= dans le texte de la page résultante, qui sera dans la structure de : APP_ID|HEXNUM-USER_ID|WEIRD_KEY

4) téléchargez maintenant soit à partir de l'api graphique, soit à partir de l'api classique de repos en utilisant le jeton d'accès de serment que vous venez d'obtenir (où SOURCE_ID est l'identifiant facebook de l'utilisateur/groupe/quelque chose que vous recherchez) :

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

Noter que l'api graphique et l'api de repos ne renvoient pas seulement des structures différentes, mais aussi des informations différentes -- donc ici, je préfère les résultats de l'api de repos (la première) même si j'aime pouvoir restreindre les champs dans la nouvelle api graphique (la seconde).

Regardez http://developers.facebook.com/docs/authentication/ dans les sections "Demande de permissions étendues" et "Authentification des utilisateurs dans une application Web" pour les détails officiels (épars).

Si vous voulez faire cela de manière routinière, c'est-à-dire par programme, voici la version automatisée des étapes 2+3 :

Mettez ceci sur votre serveur web en tant que "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! ?>

Et diriger les utilisateurs dans leurs navigateurs vers : 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

11voto

Quentin Points 2116

Si vous voulez finalement utiliser PHP, avec le kit SDK PHP de Facebook v3 ( voir sur github ), c'est assez simple. Pour connecter quelqu'un avec le offline_access la permission, vous la demandez lorsque vous générez l'URL de connexion. Voici comment faire.

Obtenir le jeton d'accès hors ligne

Il faut d'abord vérifier si l'utilisateur est connecté ou non :

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;
  }
}

S'il ne l'est pas, vous générez l'URL "Connexion avec Facebook" en demandant l'identifiant offline_access permission :

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

Et ensuite afficher le lien dans votre modèle :

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

Vous pouvez ensuite récupérer le jeton d'accès hors ligne et le stocker. Pour le récupérer, appelez :

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

Utiliser le jeton d'accès hors ligne

Pour utiliser le jeton d'accès hors ligne lorsque l'utilisateur n'est pas connecté :

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

$facebook->setAccessToken("...");

Et maintenant vous pouvez faire des appels API pour cet utilisateur :

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

J'espère que cela vous aidera !

6voto

Jon Points 545

J'ai fait un tutoriel il n'y a pas si longtemps sur mon blog. Il ne nécessite aucun plugin ou autre, il est fait en PHP, et je l'ai testé. Je l'ai fait principalement pour les messages muraux, mais après vous être authentifié, vous pouvez utiliser n'importe quelle fonction que vous voulez.

EDIT : Le message n'existe plus. L'API FB est quand même mise à jour...

5voto

daaku Points 2279

Vous voulez commencer par lire le Flux côté serveur dans le guide d'authentification. En gros, commencez par cette URL :

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

Ajoutez votre identifiant de l'application ( disponible ici ) à l'URL, qui en langage OAuth est client_id :

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

Ajouter le offline_access autorisation o scope dans le langage d'OAuth :

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

Ajouter un redirect_uri qui est l'endroit vers lequel Facebook redirigera l'utilisateur après qu'il ait terminé l'étape d'autorisation ("Autoriser" ou "Ne pas autoriser", consultez les documents pour le format de réponse ou essayez simplement) :

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

Si vous suivez le lien ci-dessus Si vous cliquez sur "Autoriser" ou "Ne pas autoriser", vous accédez à une page qui renvoie la demande. Si vous cliquez sur "Autoriser", vous obtiendrez un message d'avertissement. code en retour, que vous pouvez échanger contre un access_token en faisant une requête HTTP à Facebook depuis votre serveur, ce qui donne à peu près ceci :

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

Vous devez passer dans votre client_id , votre secret de l'application doit être transmis en tant que client_secret le même redirect_uri comme vous l'avez utilisé précédemment et le code que vous avez reçu comme réponse. Cela renverra le offline_access activé access_token pour cet utilisateur.

Une chose à garder à l'esprit cependant est que même si vous demandez offline_access votre application doit gérer de manière élégante les jetons d'accès invalides ou expirés, car cela peut se produire pour diverses raisons.

2voto

Leonid L Points 21

Je connais deux solutions : Java et JavaScript

Java : a. code de la servlet (n'oubliez pas d'importer les jar's pertinents) :

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;

//Vous serez invité à vous connecter à Facebook et à autoriser les permissions étendues.

b. N'oubliez pas de définir votre ConnectUrl (dans l'application de votre compte facebook) en tant que http://YourUrlFromWhereDoYouTurnToTheServletAbove

c. faites une autre servlet : YOUR_FaceBookCallback_SERVLET (voir ci-dessus) avec ce code :

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. Utilisez cette clé secrète de session comme ceci :

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

Si quelqu'un veut la solution JavaScript (le gros trou dans la sécurité), écrivez-moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X