Hola, estoy tratando de usar la autenticación del lado del servidor de facebook para obtener el token de acceso pero me siguen arrojando errores.Token de acceso de Facebook - Autenticación del lado del servidor
estoy usando el abajo:
$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.");
}
ID de aplicación y APP Secreto se han eliminado, así que no se preocupe por esa parte. Recibo errores sobre el tiempo de espera get_file_contents.
[function.file-get-contents]: failed to open stream: Connection timed out
¿Hay alguna otra forma mejor de obtener los tokens de acceso?
Bellow es la versión que he probado incluyendo la 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.");
}
}
Detalles:
aplicación Ajustes - URL de la lona: 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/
Incluso con esta actualización i todavía obtiene este error:
antiguo error
Well Done! - {"error":{"message":"Error validating verification code.","type":"OAuthException","code":100}}
nuevo error
Este parece ser causada por la redirección de retirar el código del estado.
The state does not match. You may be a victim of CSRF. - 193c791ddd71c3fd84d411db5554c315 (state code)
También he tratado de pasar por la protección CSRF cambiando:
if($_REQUEST['state'] == $_SESSION['state'])
A:
if(!empty($code))
Pero esto todavía da el problema de error de edad, he oído que es causada por algo en el enlace de redirección, pero no estoy seguro de cómo solucionarlo.
problema resuelto
Después de probar lo largo del tiempo que he dado a usar el SDK de PHP mediante el siguiente para obtener el token de acceso de usuario:
$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;
}
Ahora voy a convertir esto en algunos función sorta. Muchas gracias por todo el tiempo y ayuda.
Esperanza esto ayuda a las personas necesitadas en el futuro (a no ser que Facebook cambia de repente todo)
¿Alguna razón por la que no desea utilizar Facebook PHP SDK? – phwd
@phwd La razón por la que no estoy usando el PHP SDK es porque me está dando el token de acceso a la aplicación, no el token de acceso del usuario, que es lo que necesito para hacer lo que quiero. –