2012-05-31 17 views
7

Ciao sto cercando di utilizzare l'autenticazione lato server di Facebook per ottenere il token di accesso ma continuo a ricevere gli errori lanciati contro di me.Token di accesso Facebook - Autenticazione lato server

Sto usando il soffietto:

$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 Segreto sono stati rimossi in modo da non preoccuparsi di quella parte. Ottengo errori sul get_file_contents timeout.

[function.file-get-contents]: failed to open stream: Connection timed out

Esiste un altro o un modo migliore per ottenere i token di accesso?

Bellow è la versione che ho provato compresa l'idea 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:

App Impostazioni - 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 i ottieni ancora questo errore:

Vecchio ERRORE

Well Done! - {"error":{"message":"Error validating verification code.","type":"OAuthException","code":100}}

nuovo errore

Questo sembra essere causato dal reindirizzamento rimuovendo il codice di stato.

The state does not match. You may be a victim of CSRF. - 193c791ddd71c3fd84d411db5554c315 (state code)

Ho anche provato bypassando la protezione CSRF modificando:

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

TO:

if(!empty($code)) 

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

problema risolto

Dopo aver provato con il tempo che ho portato a usare il PHP SDK utilizzando la sottostante per ottenere il token di accesso 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', array(
    'client_id'  => FB_APP_ID, 
    'client_secret' => FB_SECRET_ID, 
    'type'   => 'client_cred', 
    'code'   => $code, 
)); 
$token = $facebook->getAccessToken(); 
echo$token; 
} 

ora sto andando a trasformare questo in un certo sorta di funzione. Grazie mille per il tempo e l'aiuto di tutti.

Spero che questo aiuta le persone in stato di bisogno in futuro (a meno che Facebook cambia tutto all'improvviso)

+0

Qualsiasi motivo per cui non si desidera utilizzare l'SDK PHP di Facebook? – phwd

+0

@phwd Il motivo per cui non sto utilizzando l'SDK di PHP è che mi sta dando il token di accesso dell'applicazione non il token di accesso utente, che è quello che ho bisogno di fare ciò che voglio. –

risposta

8

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

UPDATE

Per recuperare l'accesso degli utenti gettone è necessario inviare richiesta OAuth prima di ottenere l'accesso token. Dettagli nell'aggiornamento della risposta:

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

getAccessToken() attualmente mi fornisce solo il token di accesso dell'applicazione che non è abbastanza buono per quello di cui ho bisogno. Desidero richiedere il token di accesso dell'utente. Come faccio a configurarlo per farlo? –

+0

Utilizzare il metodo 'getUserAccessToken()' per quello – Oleg

+0

sembra così vicino ma questo errore: 'Errore irreversibile: chiamata al metodo protetto BaseFacebook :: getUserAccessToken()' –

2

due più probabili cause del fallimento in questa fase sono:

  • redirect_uri manca il finale '/'
  • redirect_uri nella chiamata a /oauth/access_token non corrisponde esattamente alla redirect_uri hai fornito per la finestra di dialogo OAuth

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

L'errore "impossibile aprire lo stream: connessione scaduta" probabilmente non è correlato a questo, ma di solito punta a un Errore DNS o di rete durante il tentativo di raggiungere graph.facebook.com dal tuo server

+0

the redirect_uri = http://www.apps.elistone.co.uk/DrawMyFriend/ quindi ha la barra finale. Da quello che vedo, l'uri è esattamente lo stesso ... Quindi cosa manca. –

Problemi correlati