Token di accesso di Facebook – Autenticazione lato server

Ciao sto cercando di utilizzare l'authentication lato server di Facebook per get il token di accesso ma continuo a ricevere gli errori lanciati contro di me.

Sto usando il muggito:

$app_id = "YOUR_APP_ID"; $app_secret = "YOUR_APP_SECRET"; $my_url = "YOUR_URL"; session_start(); $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_REQUEST['state'] == $_SESSION['state']) { $token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; $response = file_get_contents($token_url); $params = null; parse_str($response, $params); $graph_url = "https://graph.facebook.com/me?access_token=" . $params['access_token']; $user = json_decode(file_get_contents($graph_url)); echo("Hello " . $user->name); } else { echo("The state does not match. You may be a victim of CSRF."); } 

App ID e APP Secret sono stati rimossi quindi non preoccuparti di quella parte. Ottengo errori sul get_file_contents timeout.

[function.file-get-contents]: imansible aprire lo stream: Timeout della connessione

C'è un altro o migliore modo di get i token di accesso?

Bellow è la versione che ho provato includendo l'idea di cURL:

 function get_data_cURL($url) { $ch = curl_init(); $timeout = 5; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); $data = curl_exec($ch); curl_close($ch); return $data; } function getAccessToken(){ $app_id = FB_APP_ID; $app_secret = FB_SECRET_ID; $canvas_URL = FB_CANVAS_URL; session_start(); $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($canvas_URL) . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_REQUEST['state'] == $_SESSION['state']) { $token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($canvas_URL) . "&client_secret=" . $app_secret . "&code=" . $code; $returned_content = get_data_cURL($token_url); echo'Well Done! - '.$returned_content; } else { echo("The state does not match. You may be a victim of CSRF."); } } 

Dettagli:

Impostazioni app – URL canvas: http://www.apps.elistone.co.uk/DrawMyFriend/

 FB_APP_ID = The Facebook App ID FB_SECRET_ID = The Facebook Secret ID FB_CANVAS_URL = http://www.apps.elistone.co.uk/DrawMyFriend/ 

Anche con questo aggiornamento ho ancora questo errore:

Vecchio errore

Molto bene! – {"errore": {"messaggio": "Errore durante la validation del codice di verifica.", "tipo": "OAuthException", "codice": 100}}

Nuovo ERRORE

Questo sembra essere causato dal reindirizzamento che rimuove il codice di stato.

Lo stato non corrisponde. Potresti essere una vittima di CSRF. – 193c791ddd71c3fd84d411db5554c315 (codice dello stato)

Ho anche provato a bypassare la protezione CSRF cambiando:

 if($_REQUEST['state'] == $_SESSION['state']) 

A:

  if(!empty($code)) 

Ma questo dà ancora il vecchio problema di errore, ho sentito che è causato da qualcosa nel link di reindirizzamento ma non sono sicuro di come risolverlo.

PROBLEMA RISOLTO

Dopo aver provato nel tempo ho portto a utilizzare l'SDK PHP utilizzando il sotto per get il token di accesso dell'utente:

 $app_id = FB_APP_ID; $app_secret = FB_SECRET_ID; $canvas_URL = FB_PAGE_URL; $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . $canvas_URL . "&state=" . $_SESSION['state']; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_REQUEST['state'] == $_SESSION['state']) { $facebook->api('oauth/access_token', arrays( 'client_id' => FB_APP_ID, 'client_secret' => FB_SECRET_ID, 'type' => 'client_cred', 'code' => $code, )); $token = $facebook->getAccessToken(); echo$token; } 

Ora trasformsrò questo in una sorta di function. Grazie mille per il tempo e l'aiuto di tutti.

Spero che questo aiuti le persone in difficoltà in futuro (a less che Facebook cambi tutto all'improvviso)

Ti consiglio di utilizzare la libreria PHP SDK per comunicare con l'API di Facebook. E semplicemente usa i getAccessToken() o getAccessTokenFromCode() .

AGGIORNARE

Per recuperare il token di accesso utente devi submit oauth request prima di get il token di accesso. Dettagli nell'aggiornamento della risposta:

  $facebook->api('oauth/access_token', arrays( 'client_id' => APP_ID, 'client_secret' => APP_SECRET, 'type' => 'client_cred', 'code' => $code, )); $token = $facebook->getAccessToken(); 

Due cause più probabili di fallimento in questo passaggio sono:

  • redirect_uri manca il trailing '/'
  • redirect_uri nella tua chiamata a /oauth/access_token non corrisponde ESATTAMENTE al redirect_uri che hai fornito alla window di dialogo oauth

In entrambi i casi, la verifica del codice fallirà e non otterrai un token,

L'errore "imansible aprire lo stream: connessione scaduta" probabilmente non è correlato a questo, ma di solito punta a un errore DNS o di networking quando tenti di raggiungere graph.facebook.com dal tuo server