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)
Qualsiasi motivo per cui non si desidera utilizzare l'SDK PHP di Facebook? – phwd
@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. –