2009-06-29 7 views
57

MISE À JOUR: L'autorisation Facebook offline_access est en cours de désapprobation. Veuillez vous référer au official documentation pour plus d'informations.
Vous aurez jusqu'au le 1er mai 2012, date à laquelle ce paramètre sera désactivé. reportez-vous au Developer Roadmap pour plus d'informations.Accès hors connexion Facebook, étape par étape


Après la 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 cherche une étape par étape explication pour obtenir offline_access pour un utilisateur pour une application facebook, puis en utilisant ce (clé de session) pour récupérer hors ligne & pas dans un navigateur amis & données de profil.

Préférablement cela dans l'API Java 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 offline_Access, cependant, comment récupérer la session_key? Pourquoi ne pas Facebook suffit de faire une simple documentation, je veux dire, il y a environ 600 personnes qui travaillent là-bas?

La même question en apparence: Getting offline_access to work with 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 vraiment essayé un tel accès par lots à encore ...

+11

Normalement, je serais d'accord avec vous, mais quand il s'agit de facebook, le manuel est souvent déroutant et contradictoire. – Paul

+3

Je suis d'accord. Les gens FB ont besoin d'améliorer la documentation. C'est pire que iOS et Xcode. –

Répondre

3

Je connais deux solutions: Java et JavaScript

Java: a. code servlet (ne pas oublier d'importer pot est pertinent):

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 obtiendrez rapidement pour se connecter à facebook et permettre aux autorisations étendues

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

c. faire 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 ce session_key secret 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é) me écrire

6

Je l'ai fait un tutoriel pas trop longtemps sur mon blog.Il ne nécessite pas de plugin ou autre, c'est fait en PHP, et je l'ai testé. Je l'ai fait pour les messages muraux principalement, mais après vous authentifier, vous pouvez utiliser la fonction que vous voulez.

EDIT: Le message n'existe plus. FB API est mis à jour de toute façon ...

+0

@Jon - Merci pour ce tutoriel. – JSchaefer

+0

Pas de soucis: D J'espère que ça a aidé à mettre en place quelque chose de génial! –

+0

Ceci utilise l'ancien SDK PHP Facebook qui n'est plus valide. – Quentin

2

J'ai trouvé comment "récupérer" la clé de session infinie d'accès hors connexion après beaucoup de chevauchement, quelques essais et erreurs & s'interrogeant sur toutes les autres façons productives que j'aurais pu dépenser cette fois-ci ... accepter la documentation de facebook pourrait être beaucoup mieux

1) Si vous utilisez le facebook-java-api .. alors jetez un oeil sur le site de démonstration facebook pour "web mobile" sur la façon de formater le 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 "suivante" après l'octroi de l'accès hors connexion, vous devriez obtenir la session facebook "nouveau". session aura la clé de session infinie.
ici est un exemple pour le web mobile ... vous devriez être en mesure de le comprendre pour une auth_token régulière website.The est utilisé uniquement pour les sites Web mobiles .. vous ne pouvez pas avoir besoin d'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)); 
63

Avec la nouvelle API Facebook Graph, les choses se sont un peu simplifiées mais beaucoup moins bien documentées. Voici ce que je fait pour être en mesure de charger mes messages de mur comme moi d'un côté serveur uniquement (ne fait pas partie d'une session du navigateur) script php:

  1. créer une application facebook, si vous ne possédez pas déjà un utilisable pour ce projet http://www.facebook.com/developers/apps.php#!/developers/createapp.php - et de définir le mode sandbox/développeur sur! @ Paramètres avancés> Mode Bac à sable> Activer (Permet aux développeurs de votre application de le voir.) Vous devez disposer de l'ID d'application (APP_ID) et de la clé secrète (SECRET_KEY) répertoriés dans le résumé de votre compte de développeur de cette application. l'ancienne clé API.

  2. charge dans votre navigateur, déjà connecté à fb que le compte que vous voulez que votre application côté serveur pour la connexion et 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. copier le « code » paramètre de la chaîne de requête d'URL résultante, utilisez que: 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 qui, qui sera dans la structure: APP_ID | HEXNUM-USER_ID | WEIRD_KEY

  4. maintenant télécharger soit à partir du graphique api ou le cl api de repos ASSIC utilisant le vous accès serment Jeton juste obtenu ala (où SOURCE_ID est l'ID de facebook pour l'utilisateur/groupe/whatever que vous êtes à la recherche vers le haut):

    <?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 le api graphique et de repos api renvoie non 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 (le premier) même si j'aime pouvoir restreindre les champs dans le nouveau graphique api (le second).

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

Si vous voulez faire régulièrement, ce programme, voici la version automatisée des étapes 2 + 3:

Mettre cela 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 les utilisateurs directs dans leurs navigateurs à: 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

Merci son aide m'a beaucoup. – PrateekSaluja

+0

Omg juste ce que je cherchais depuis deux jours! Tu es mon Sauveur! – Somebody

+0

Génial! Tu as sauvé ma journée ... –

0

pour l'accès aux sessions, je devais utiliser le loginUrl fourni par le facebook php api, car il semble y avoir 2/3 variables supplémentaires qu'il envoie dans la demande de auth, y compris r eturn_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 ça a marché:

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

Pour demander l'authentification:

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

Rember pour inclure offline_access portée de $. Une fois que vous êtes redirigé vers cette page (après vous être connecté à fb, et avoir accordé des 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 voulez faire quelque chose avec le compte de l'utilisateur, il suffit d'utiliser les éléments suivants:

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

Après cette toute demande que le fait api sera via l'accès de cet utilisateur. La pire chose à propos de l'API Facebook 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 le access_token. Mais l'API actuelle (php5-sdk) n'a aucune fonctionnalité pour envoyer une requête réelle en utilisant seulement le access_token. S'il y a une fonction pour démarrer une session en utilisant seulement access_token, je ne suis pas au courant.

11

Si vous voulez enfin utiliser PHP, avec le Facebook PHP SDK v3 (see on github), c'est assez simple. Pour enregistrer quelqu'un avec l'autorisation offline_access, vous le demandez lorsque vous générez l'URL de connexion. Voici comment vous faites cela.

Obtenez l'accès hors ligne jeton

D'abord, vous 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 n'est pas, vous créez la « Connexion avec Facebook » URL demandant le offline_access autorisation:

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

Et puis afficher 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, composez le:

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

Utilisez le jeton d'accès en ligne

Pour utiliser le jeton d'accès en mode 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'); 

Hope that helps!

+0

Merci pour les informations mises à jour. – aiham

5

Vous voulez commencer par lire la section Server Side Flow dans le guide d'authentification. Au fond, commencer par cette URL:

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

Ajoutez votre application id (available here) à l'URL, ce qui dans le langage OAuth est client_id:

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

Ajouter le offline_accesspermission ou scope dans le langage OAuth :

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

Ajouter un redirect_uri qui est l'endroit où Facebook va rediriger vers après que l'utilisateur termine l'étape d'autorisation (« Autoriser » ou « Ne pas Autoriser », regardez docs pour le format de réponse ou juste essayer de sortir):

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

Si vous suivez the link above, il vous mènera à une invite, puis en cliquant sur Autoriser/Ne pas autoriser cela vous amènera à une page qui "répercute" la demande. Si vous cliquez sur Autoriser, vous obtiendrez un paramètre code retour, que vous pouvez échanger contre un access_token en faisant une requête HTTP à Facebook à partir de votre serveur, qui fait quelque chose le long des lignes de ce:

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

Vous avez besoin pour passer dans votre client_id, votre application secrète doit être passé en tant que client_secret, le même redirect_uri que vous avez utilisé précédemment et le code 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 gracieusement les access_tokens invalides ou expirés, car cela peut arriver pour diverses raisons.

Questions connexes