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

mise à jour : Facebook offline_access permission est dépréciée. Veuillez vous référer à la documentation officielle pour plus d'informations.

Vous avez jusqu'au 1 mai 2012 , à quelle date ce réglage sera désactivée. reportez-vous au Developer Roadmap pour plus d'informations.


après recherche littéralement 1 jour sur facebook et google pour une mise à jour et travail façon de faire quelque chose en apparence simple:

je suis à la recherche d'une explication étape par étape pour obtenir offline_access pour un utilisateur pour une application facebook, puis en utilisant cette (clé de session) pour récupérer hors ligne et non dans un navigateur amis & données de profil.

fait préférablement cela dans L'API Java de Fb.

Merci.

et oui j'ai vérifié le wiki facebook.

Mise À Jour: Quelqu'Un?

ce: http://www.facebook.com/authorize.php?api_key=<api-key>&v=1.0&ext_perm=offline_access me donne l'accès offline_Access, cependant 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 y a environ 600 personnes qui y travaillent?

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

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

57
demandé sur Community 2009-06-29 22:06:27

7 réponses

avec la nouvelle API Facebook Graph, les choses sont devenues un peu plus simples mais beaucoup moins bien documentées. Voici ce que j'ai fait pour être en mesure de charger mes messages muraux que moi d'un côté du serveur seulement (ne fait pas partie d'une session de navigateur) script php:

  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 bac à sable / développeur! @ Paramètres avancés > mode bac à sable > activer (permet seulement les développeurs de votre application voir it.) Vous aurez besoin de L'ID D'Application (APP_ID) et de la clé secrète (SECRET_KEY) qui sont listés dans le résumé de votre compte de développeur de cette application, mais pas de l'ancienne clé API.

  2. chargez dans votre navigateur, déjà connecté à fb Comme le compte que vous voulez que votre application côté serveur se connecter sous, 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. Copiez le paramètre "code" du la chaîne de requête de l'url résultante, utilisez cela 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. maintenant téléchargez soit à partir de l'api graph ou de l'api rest classique en utilisant le jeton d'accès de serment que vous venez d'obtenir ala (où SOURCE_ID est l'id facebook de l'utilisateur/groupe/quoi que vous cherchiez):

    <?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 l'api graph et l'api rest renvoient non seulement des structures différentes, mais aussi des informations différentes -- donc ici, je préfère les résultats de l'api rest (la première) même si j'aime pouvoir restreindre les champs dans la nouvelle api graph (la deuxième).

regardez http://developers.facebook.com/docs/authentication / dans les sections "Requesting Extended Permissions" et "Authenticating Users in a Web L'Application" officielle (sparse) détails.

si vous voulez le faire de façon routinière, c'est-à-dire programmée, voici la version automatisée des étapes 2+3:

mettez ceci sur votre serveur web comme" 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 d'ordonner aux utilisateurs dans leurs navigateurs de: 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
répondu Chris 2016-02-27 17:40:01

si vous voulez enfin vouloir utiliser PHP, avec le Facebook PHP SDK v3 ( voir sur github ), il est assez simple. Pour enregistrer quelqu'un avec la permission offline_access , vous le demandez lorsque vous générez L'URL de connexion. Voici comment vous le faites.

Obtenir le jeton d'accès en mode hors connexion

Vérifiez D'abord 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 le " Login avec Facebook" URL demandant la 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 ?>

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

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

utiliser le jeton d'accès hors ligne

pour utiliser le token 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');

Espère que ça aide !

11
répondu Quentin 2011-05-31 04:37:02

j'ai fait un tutoriel il n'y a pas si longtemps sur mon blog. Il n'a pas besoin de plugins ou autre chose, il est fait en PHP, et je l'ai testé. Je l'ai fait pour les poteaux muraux, mais après que vous vous authentifiez vous pouvez utiliser n'importe quelle fonction que vous voulez.

EDIT: Post n'existe plus. L'API FB est mise à jour de toute façon...

6
répondu Jonathan Reyes 2012-01-03 23:58:04

vous voulez commencer par lire la section flux Côté Serveur dans le guide d'authentification. En gros, commencez par cette URL:

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

ajouter votre application id ( disponible ici ) à L'URL, qui dans le jargon est client_id :

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

Ajouter offline_access autorisation ou scope dans OAuth langage:

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

Ajouter un redirect_uri qui est l'endroit où Facebook sera redirigé après que l'utilisateur a terminé l'étape de l'autorisation ("Autoriser" ou "Ne pas Autoriser", regarder les docs pour la forme de la réponse ou tout simplement de l'essayer):

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 au-dessus de , il vous mènera à un prompt, et puis en cliquant Autoriser/Dont Autoriser il vous mènera à une page que "echos" arrière la demande. Si vous cliquez sur Autoriser, vous obtiendrez un code retour paramètre, que vous pouvez échanger pour un access_token en faisant une demande HTTP à Facebook à partir de votre serveur, ce qui fait quelque chose dans le sens de 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 application secret doit être passé comme le client_secret , le même redirect_uri que vous avez utilisé plus tôt et le code que vous avez reçu comme réponse. Cela va retourner 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 traiter gracieusement access_tokens invalide ou périmé, comme cela peut arriver pour diverses raisons.

5
répondu daaku 2011-07-19 03:35:40

je connais deux solutions: Java et JavaScript

Java : A. code servlet (n'oubliez pas d'importer les pots 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 votre application de compte facebook) comme http://YourUrlFromWhereDoYouTurnToTheServletAbove

C. marque 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);}

D. Utilisez cette clé de session secrète 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 le code JavaScript de la solution(le gros trou de sécurité) écrivez-moi

3
répondu Leonid L 2009-09-01 17:36:28

j'ai trouvé comment" récupérer " la clé de session infinie d'accès hors ligne après beaucoup de fentes de cheveux, d'essais et d'erreurs et de questions sur toutes les autres façons productives que j'aurais pu passer ce temps... d'accord la documentation facebook pourrait être beaucoup mieux

1) Si vous utilisez l'api facebook-java.. ensuite, jetez un oeil au site de démonstration facebook pour "mobile web" sur la façon de formater L'URL pour demander l'accès hors ligne

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) Comment obtenir la clé de session hors ligne de la session..L'astuce est la suivante: lorsque facebook redirige l'utilisateur vers l'url" next "juste après avoir accordé l'accès hors ligne, vous devriez obtenir la session facebook"à nouveau"..cette nouvelle session aura la touche session infinie.

voici un exemple pour mobile web...vous devriez être en mesure de le comprendre, pour un site web standard.Auth_token n'est utilisé que pour des sites web mobiles.. vous pourriez ne pas en avoir besoin pour un site Web régulier

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
répondu Naren 2009-11-05 17:18:42

pour accéder à la session, j'ai dû utiliser le loginurl fourni par l'api PHP facebook, car il semble y avoir 2/3 variables supplémentaires qu'il envoie dans la requête auth, y compris return_session et session_version. Aussi le nouveau php5-sdk envoie la demande à login.facebook.com au lieu de https://graph.facebook.com/oauth/authorize . Voici comment j'ai compris:

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

pour demander l'authentification :

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

Rember inclure offline_access dans $champ d'application. Une fois que vous êtes redirigé vers cette page (après vous être connecté à fb, et avoir accordé les permissions), vous aurez 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 faire quelque chose avec le compte de l'utilisateur, il suffit d'utiliser ce qui suit:

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

après ceci toutes les requêtes que l'api fait seront via l'accès de cet utilisateur.

la pire chose à propos de l'api Facebook graph actuelle est (corrigez-moi si je me trompe) que l'api actuelle néglige la session (qui semble être un reste 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 de fonction pour envoyer une requête réelle en utilisant seulement access_token. S'il y a une fonction pour démarrer une session une session utilisant seulement le access_token, Je n'en suis pas conscient.

0
répondu Nemo 2011-01-29 15:23:15