web-dev-qa-db-fra.com

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

UPDATE: L'autorisation Facebook offline_access est obsolète. Veuillez vous référer à documentation officielle pour plus d'informations.
Vous aurez jusqu'au 1er mai 2012, date à laquelle ce réglage sera désactivée. reportez-vous au feuille de route des développeurs pour plus d'informations.


Après avoir recherché littéralement 1 jour sur facebook et google pour un moyen à jour et efficace de faire quelque chose qui semble simple:

Je cherche une explication étape par étape pour obtenir offline_access pour un utilisateur pour une application facebook, puis l’utiliser (clé de session) pour récupérer les données hors connexion et non dans un navigateur, et les données de profil.

De préférence, cela dans l'API Java Fb.

Merci.

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

Mise à jour: Quelqu'un? 

this: http://www.facebook.com/authorize.php?api_key=<api-key>&v=1.0&ext_perm=offline_accessgives me offline_Access, mais comment récupérer la clé de session?

Pourquoi Facebook ne peut-il pas simplement faire de la documentation simple, je veux dire qu’il ya environ 600 personnes qui y travaillent?

La même question en apparence: Obtenir offline_access de fonctionner avec Facebook Ne répond pas comment récupérer la clé de session

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

57
Ben

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

  1. créez 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 bac à sable/développeur! @ Paramètres avancés> Mode bac à sable> Activer (permet aux développeurs de votre application uniquement de la voir.) Vous aurez besoin de l'ID d'application (APP_ID) et de la clé secrète (SECRET_KEY) répertoriés dans le récapitulatif de votre compte de développeur pour cette application. mais pas l'ancienne clé API.

  2. chargez dans votre navigateur, déjà connecté au fb en tant que compte auquel vous souhaitez que votre application côté serveur se connecte, puis cliquez sur "autoriser" pour les autorisations 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. copiez le paramètre "code" de la chaîne de requête de l'URL résultante, utilisez-le 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 depuis l’API graphique ou l’API classique de repos en utilisant le jeton d’accès à serment que vous venez de recevoir (où SOURCE_ID est l’identifiant facebook de l’utilisateur/du groupe/quel que soit votre choix):

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

Notant que les graphiques api et reste api ne renvoient pas seulement des structures différentes, mais également des informations différentes - alors, ici, je préfère les résultats de l'api de repos (le premier), même si j'aime bien pouvoir restreindre les champs du nouveau graphique. api (le second).

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

Si vous voulez le faire régulièrement, c’est-à-dire par programme, voici la version automatisée des étapes 2 et 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 dirigez les utilisateurs de leur navigateur 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

63
Chris

Si vous voulez enfin utiliser PHP, avec le SDK v3 de Facebook PHP ( voir sur github ), c'est assez simple. Pour connecter quelqu'un avec l'autorisation offline_access, vous lui demandez quand vous générez l'URL de connexion. Voici comment vous faites ça.

Obtenir le jeton d'accès hors connexion

Tout d'abord, vous vérifiez 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 le fait pas, vous générez l'URL "Connexion avec Facebook" demandant l'autorisation offline_access:

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

Et puis affichez le lien dans votre modèle:

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

Ensuite, vous pouvez récupérer le jeton d'accès hors connexion et le stocker. Pour l'obtenir, appelez:

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

Utiliser le jeton d'accès hors connexion

Pour utiliser le jeton d'accès hors connexion 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 pourra aider !

11
Quentin

J'ai fait un tutoriel il n'y a pas si longtemps sur mon blog. Il ne nécessite aucun plugin ou autre chose, c'est fait en PHP, et je l'ai testé. Je l’ai fait principalement pour les poteaux muraux, mais après vous être authentifié, vous pouvez utiliser la fonction de votre choix.

EDIT: La poste n'existe plus. L'API FB est mise à jour malgré tout ... 

6
Jonathan Reyes

Vous souhaitez commencer par lire la section flux côté serveur du guide d'authentification. Fondamentalement, commencez par cette URL:

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

Ajoutez votre ID d'application ( disponible ici ) à l'URL qui, dans le langage OAuth, est client_id:

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

Ajoutez le offline_accesspermission ou scope dans le langage OAuth:

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

Ajoutez un redirect_uri qui correspond à la redirection de Facebook une fois que l'utilisateur aura terminé l'étape d'autorisation ("Autoriser" ou "Ne pas autoriser", consultez le format de réponse dans la documentation ou essayez-le 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 _, vous obtiendrez une invite, puis si vous cliquez sur Autoriser/Ne pas autoriser, vous obtiendrez une page qui "répercutera" la demande. Si vous cliquez sur Autoriser, vous obtiendrez un paramètre code, que vous pourrez échanger contre un access_token en envoyant une requête HTTP à Facebook depuis votre serveur, ce qui a pour effet:

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

Vous devez transmettre votre client_id, votre secret application doit être transmis sous le client_secret, le même redirect_uri que celui que vous avez utilisé précédemment et la code que vous avez reçue en tant que réponse. Cela renverra le offline_access activé access_token pour cet utilisateur.

Il convient toutefois de garder à l'esprit que même si vous demandez offline_access, votre application doit gérer avec élégance des variables d'accès non valides ou expirées, car cela peut se produire pour diverses raisons.

5
daaku

Je connais deux solutions: Java et JavaScript

Java: A. code de servlet (n'oubliez pas d'importer les jars 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 autorisations étendues.

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

c. créez un 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);}

ré. Utilisez cette clé secrète session_key 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 grand trou dans la sécurité) écrivez-moi

3
Leonid L

J'ai découvert comment "récupérer" la clé de session infinie d'accès hors connexion après de nombreuses entailles, des essais et des erreurs et des interrogations sur toutes les autres façons productives que j'aurais pu utiliser ce temps ... convenez que la documentation sur Facebook pourrait être très utile meilleur 

1) Si vous utilisez facebook-Java-api .., jetez un coup d'œil au site de démonstration de Facebook pour "Web mobile" et expliquez comment formater l'URL pour demander un accès hors connexion.
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 ce qui concerne l'obtention de la clé de session hors connexion à partir de la session, l'astuce est la suivante: lorsque Facebook redirige l'utilisateur vers la "prochaine" URL juste après avoir accordé l'accès en mode hors connexion, vous devez récupérer la session facebook "à nouveau" .. cette nouvelle session aura la clé de session infinie.
voici un exemple pour le Web mobile ... vous devriez être capable de le comprendre pour un site Web régulier. L'auth_token est utilisé uniquement pour les sites Web mobiles. Vous n'en aurez peut-être pas besoin pour un site 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));
2
Naren

Pour accéder à la session, je devais utiliser l'identifiant de connexion fourni par l'API php de facebook, car il semble y avoir 2/3 variables supplémentaires envoyées dans la requête auth, notamment return_session et session_version. De plus, le nouveau php5-sdk envoie la demande à login.facebook.com au lieu de https://graph.facebook.com/oauth/authorize . Voici comment j'ai travaillé:

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

Pour demander l'authentification:

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

Rappelez-vous d'inclure offline_access dans $ scope. Une fois que vous êtes redirigé vers cette page (après vous être connecté à fb et avoir accordé des autorisations), vous obtenez un $ _GET ['session'] au format json.

Il suffit de le stocker où vous voulez (je le fais dans une base de données). La prochaine fois que vous souhaitez utiliser le compte de l'utilisateur, utilisez simplement les éléments suivants:

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

Après cela, toutes les requêtes de l’API se feront via l’accès de cet utilisateur.

La pire chose à propos de l'API graphique actuelle sur Facebook est (corrigez-moi si je me trompe) que l'API actuelle néglige la session (ce qui semble être un vestige de l'ancienne API) dans toute sa documentation et ne parle que de l'access_token. Mais l’API actuelle (php5-sdk) n’a pas la possibilité d’envoyer une requête en utilisant uniquement le code d’accès. S'il existe une fonction permettant de démarrer une session, une session utilisant uniquement le paramètre access_token, je ne suis pas au courant.

0
Nemo