Accesso offline a Facebook passo dopo passo

AGGIORNAMENTO : l’authorization di Facebook offline_access è obsoleta. Si prega di fare riferimento alla documentazione ufficiale per ulteriori informazioni.
Avrai tempo fino al 1 maggio 2012 , data in cui questa impostazione sarà disabilitata. fare riferimento alla Roadmap degli sviluppatori per maggiori informazioni.


Dopo aver cercato letteralmente 1 giorno su facebook e google per un modo aggiornato e funzionante per fare qualcosa di apparentemente semplice:

Sto cercando una spiegazione dettagliata per ottenere offline_access per un utente per un’app per Facebook e quindi utilizzare questa (chiave di sessione) per recuperare offline e non all’interno di un browser amici e dati del profilo.

Preferibilmente facendo questo nell’API Java Fb.

Grazie.

E sì, ho controllato la wiki di Facebook.

Aggiornamento: chiunque?

questo: http://www.facebook.com/authorize.php?api_key=&v=1.0&ext_perm=offline_access mi dà offline_Access, tuttavia come recuperare il session_key?

Perché Facebook non può fare semplicemente una semplice documentazione, voglio dire che ci sono 600 persone che lavorano lì?

La stessa domanda apparentemente: Ottenere offline_access per funzionare con Facebook Non risponde come recuperare la chiave di sessione

Edit: Sono ancora bloccato con quello. Immagino che nessuno abbia mai provato un accesso di questo tipo a un altro …

Con la nuova API di Facebook Graph, le cose sono diventate un po ‘più semplici ma molto meno documentate. Ecco cosa ho fatto per essere in grado di caricare i miei messaggi sul muro come me da uno script php solo lato server (non parte di una sessione browser):

  1. crea un’applicazione Facebook, se non ne hai già uno utilizzabile per questo progetto http://www.facebook.com/developers/apps.php#!/developers/createapp.php – e imposta la modalità sandbox / sviluppatore su! @ Impostazioni avanzate> Modalità sandbox> Abilita (consente solo agli sviluppatori dell’applicazione di vederlo.) Avrai bisogno dell’ID applicazione (APP_ID) e della chiave segreta (SECRET_KEY) che sono elencati nel riepilogo dell’account sviluppatore di tale applicazione ma non il vecchia chiave API.

  2. carica nel tuo browser, già connesso a fb come account per il quale vuoi connettere l’app lato server e fai clic su “consenti” per le autorizzazioni richieste: 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. copia il parametro “codice” dalla stringa di query dell’URL risultante, usalo in: 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 E copia il lato destro di access_token = nel testo della pagina risultante, che sarà nella struttura di: APP_ID | HEXNUM-USER_ID | WEIRD_KEY

  4. ora puoi scaricare sia dal grafico api che dal classico sistema di rest utilizzando il token di accesso a un giuramento che hai appena ottenuto (dove SOURCE_ID è l’ID di Facebook per l’utente / gruppo / qualsiasi cosa tu stia cercando):

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

Notando che l’api del grafico e l’api di rest restituiscono non solo strutture diverse, ma anche informazioni diverse – quindi qui, preferisco i risultati del resto api (il primo) anche se mi piace essere in grado di limitare i campi nel nuovo grafico api (il secondo).

Guardare http://developers.facebook.com/docs/authentication/ nelle sezioni “Richiesta di autorizzazioni estese” e “Autenticazione degli utenti in un’applicazione Web” per i dettagli ufficiali (sparsi).

Se vuoi farlo di routine, cioè a livello di codice, ecco la versione automatica dei passaggi 2 + 3:

Metti questo sul tuo server web come “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! ?> 

E indirizzare gli utenti nei loro browser 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

Se vuoi finalmente usare PHP, con il PHP PHP SDK di Facebook v3 ( vedi su github ), è piuttosto semplice. Per registrare qualcuno con l’authorization offline_access , chiedilo quando generi l’URL di accesso. Ecco come lo fai.

Ottieni il token di accesso offline

Per prima cosa controlla se l’utente è loggato o meno:

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

In caso contrario, viene generato l’URL “Accedi con Facebook” per chiedere l’authorization offline_access :

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

E quindi visualizza il link nel tuo modello:

 < ?php if (!$user): ?> Login with Facebook < ?php endif ?> 

Quindi è ansible recuperare il token di accesso offline e memorizzarlo. Per ottenerlo, chiama:

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

Utilizza il token di accesso offline

Per utilizzare il token di accesso offline quando l’utente non ha effettuato l’accesso:

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

E ora puoi effettuare chiamate API per questo utente:

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

Spero possa aiutare !

Ho fatto un tutorial non molto tempo fa sul mio blog. Non richiede alcun plugin o altro, è fatto in PHP e l’ho testato. L’ho fatto principalmente per i messaggi a muro, ma dopo l’autenticazione puoi usare qualsiasi funzione tu voglia.

MODIFICA: il post non esiste più. L’API FB è comunque aggiornata …

Si desidera iniziare leggendo la sezione Flusso laterale del server nella guida di autenticazione. Fondamentalmente, inizia con questo URL:

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

Aggiungi l’ ID applicazione ( disponibile qui ) all’URL, che in linguaggio OAuth è client_id :

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

Aggiungi il permesso o l’ scope offline_access nel linguaggio OAuth:

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

Aggiungi un redirect_uri che è dove Facebook reindirizza a dopo che l’utente ha completato il passaggio di authorization (“Consenti” o “Non consentire”, guarda i documenti per il formato di risposta o semplicemente provalo):

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

Se segui il link sopra , ti verrà richiesto un prompt, quindi, dopo aver fatto clic su Consenti / Non consentire, ti porterà in una pagina che “echos” torna indietro alla richiesta. Se si fa clic su Consenti, si otterrà un parametro di code , che è ansible scambiare per un access_token di accesso facendo una richiesta HTTP a Facebook dal proprio server, il che fa qualcosa sulla access_token di questo:

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

Devi passare il tuo client_id , il tuo segreto dell’applicazione deve essere passato come il client_secret , lo stesso redirect_uri usato in precedenza e il code hai ricevuto come risposta. Ciò restituirà il offline_access abilitato access_token per quell’utente.

Una cosa da tenere a mente è che, anche se richiedi offline_access tua applicazione deve gestire con garbo access_tokens non validi o scaduti, poiché ciò può accadere per vari motivi.

Conosco due soluzioni: Java e JavaScript

Java: a. codice servlet (non dimenticare di importare i jar pertinenti):

 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; 

// Avrai il prompt per accedere a Facebook e consentire le autorizzazioni estese

b. Non dimenticare di definire ConnectUrl (nella tua applicazione di account Facebook) come http: // YourUrlFromWhereDoYouTurnToTheServletAbove

c. crea un altro servlet: YOUR_FaceBookCallback_SERVLET (vedi sopra) con questo codice:

 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. Usa questa session_key segreta come questa:

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

Se qualcuno vuole la soluzione JavaScript (il grande buco nella sicurezza) scrivimi

Ho scoperto come “recuperare” la chiave di sessione infinita di accesso offline dopo un sacco di capricci, alcuni tentativi ed errori e chiedendomi tutti gli altri modi produttivi in ​​cui avrei potuto passare quel tempo … accetta che la documentazione di Facebook possa essere molto meglio

1) Se stai usando il facebook-java-api .. allora dai un’occhiata al sito demo di facebook per “mobile web” su come formattare l’URL per richiedere l’accesso offline
http://itsti.me/index.php

 Connect 

2) Come ottenere la chiave di sessione offline dalla sessione. Il trucco è: quando facebook reindirizza l’utente all’URL “successivo” subito dopo aver concesso l’accesso offline, dovresti riavviare la sessione di Facebook … questa nuova sessione avrà la chiave di sessione infinita.
ecco un esempio per il web mobile … dovresti essere in grado di capirlo per un normale sito web. Il auth_token è usato solo per i siti web mobili .. potresti non averne bisogno per un normale sito web

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

Per l’accesso alla sessione, ho dovuto usare il loginurl fornito da Facebook php api, in quanto sembrano esserci 2/3 variabili aggiuntive che invia nella richiesta di autenticazione, inclusi return_session e session_version. Anche il nuovo php5-sdk invia la richiesta a login.facebook.com invece di https://graph.facebook.com/oauth/authorize . Ecco come l’ho risolto:

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

Per chiedere l’autenticazione:

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

Ricordati di includere offline_access in $ scope. Una volta che sarai reindirizzato a questa pagina (dopo aver effettuato l’accesso a fb e concedendo le autorizzazioni), avrai un $ _GET [‘sessione’] in formato json.

Basta riporlo dove vuoi (lo faccio in un database). La prossima volta che desideri fare qualcosa con l’account dell’utente, usa semplicemente quanto segue:

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

Successivamente, qualsiasi richiesta effettuata dall’API avverrà tramite l’accesso dell’utente.

La cosa peggiore dell’API del grafico di Facebook attuale è (correggimi se sbaglio) che l’api corrente trascura la sessione (che sembra essere un residuo della vecchia API) in tutta la sua documentazione e parla solo di access_token. Ma l’API corrente (php5-sdk) non ha alcuna funzione per inviare una richiesta effettiva usando solo il token di accesso. Se esiste una funzione per avviare una sessione in una sessione utilizzando solo il token di accesso, non ne sono a conoscenza.