2012-05-31 33 views
7

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)

+0

¿Alguna razón por la que no desea utilizar Facebook PHP SDK? – phwd

+0

@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. –

Respuesta

8

Le recomiendo que use PHP SDK library para comunicarse con Facebook API. Y simplemente use los métodos getAccessToken() o getAccessTokenFromCode().

ACTUALIZACIÓN

Para recuperar el acceso token de usuario tiene que enviar solicitud OAuth antes de obtener el token de acceso. Detalles en la actualización de la respuesta:

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

getAccessToken() actualmente solo me da el token de acceso a la aplicación que no es lo suficientemente bueno para lo que necesito. Deseo solicitar el token de acceso de usuario. ¿Cómo voy a configurarlo para hacer eso? –

+0

Utilice el método 'getUserAccessToken()' para que – Oleg

+0

parezca tan cerca pero este error: 'Error fatal: llame al método protegido BaseFacebook :: getUserAccessToken()' –

2

dos causas más probables de falla en este paso son:

  • redirect_uri falta el terminador '/'
  • redirect_uri en su llamada a /oauth/access_token no coincide exactamente con la redirect_uri que proporcionó al oauth de diálogo

En cualquier caso, la verificación del código fallará y no obtendrá un token,

El error "no se pudo abrir la secuencia: Tiempo de espera de conexión agotado" probablemente no está relacionado con eso, generalmente apunta a un DNS o error de red al intentar llegar a graph.facebook.com desde su servidor

+0

el redirect_uri = http://www.apps.elistone.co.uk/DrawMyFriend/ por lo que tiene la barra al final. Por lo que puedo ver, el uri es exactamente el mismo ... Entonces, ¿qué es lo que falta? –

Cuestiones relacionadas