Fichas de acceso de Facebook - Autenticación del lado del servidor

Hola, estoy tratando de usar la autenticación del lado del servidor de Facebook para obtener el token de acceso, pero me siguen lanzando errores.

Estoy usando el bramido:

$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.");
   }

La identificación de la aplicación y el secreto de la aplicación se han eliminado, así que no te preocupes por esa parte. Recibo errores sobre el tiempo de espera de get_file_contents.

[function.file-get-contents]: no se pudo abrir la transmisión: se agotó el tiempo de conexión

¿Hay otra o mejor forma de obtener los tokens de acceso?

A continuación se muestra la versión que he probado, incluida 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:

Configuración de la aplicación - URL del lienzo: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 todavía recibo este error:

ERROR ANTIGUO

¡Bien hecho! - {"error": {"mensaje": "Error al validar el código de verificación", "tipo": "OAuthException", "código": 100}}

Nuevo ERROR

Esto parece ser causado por la redirección eliminando el código de estado.

El estado no coincide. Usted puede ser una víctima de CSRF. - 193c791ddd71c3fd84d411db5554c315 (código de estado)

También he intentado omitir la protección CSRF cambiando:

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

A:

 if(!empty($code))

Pero esto sigue causando el viejo problema de error, he oído que está causado por algo en el enlace de redirección, pero no estoy seguro de cómo solucionarlo.

PROBLEMA RESUELTO

Después de intentar a lo largo del tiempo, he obtenido el uso del SDK de PHP utilizando el siguiente para obtener el token de acceso del 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 algún tipo de función. Muchas gracias por la ayuda y el tiempo de todos.

Espero que esto ayude a las personas necesitadas en el futuro (a menos que Facebook cambie todo de repente)

Respuestas a la pregunta(2)

Su respuesta a la pregunta