Error FQL 102 Requiere sesión de usuario en una consulta repetida

Tengo una consulta FQL completamente funcional, pero cuando se dispara por segunda vez aparece un código de error 102: Requiere sesión de usuario

En mi aplicación tengo una búsqueda de Autocompletar para amigos. Estoy usando jquery ui autocompletar con una fuente dinámica usando AJAX.

Esta es mi función de PHP:

function fb_buscarAmigosAutocomplete($term='',$app_user=false){ $facebook = new Facebook(array( 'appId' => APP_ID, 'secret'=> APP_SECRET )); $term=trim(strtolower($term)); //Buscar usuarios try{ $fql = " SELECT uid,name,first_name,last_name,pic_square FROM user WHERE uid IN ( SELECT uid2 FROM friend WHERE uid1=me() ) AND strpos(lower(name),'".$term."') >=0 "; if($app_user) $fql .= " AND is_app_user"; $fql .= " LIMIT 5"; $param = array( 'method' => 'fql.query', 'query' => $fql, 'callback' => '' ); $result = $facebook->api($param); } catch(FacebookApiException $e){ $error=$e->getMessage(); var_dump($e); } if(!empty($result)) { $return['amigos']=$result; $return['valido']=true; }else $return['valido']=false; return $return; } 

Lo extraño es que esto funcionó bien durante las últimas 2 o 3 semanas, y de repente se detuvo. Incluso “más extraño”, todavía funciona la primera vez que se activa, pero no la segunda vez. Dado que esto es asincrónico, no entiendo qué diferencia hace si es la primera, segunda, tercera, cuarta vez que se desencadena.

¿Algunas ideas?

Editar 1 Con más investigaciones, creo que tengo una solución alternativa. Esto puede deberse a un error informado aquí y discutido aquí

Mi solución fue atrapar el primer access_token que recibo con el Object Facebook, luego adjuntarlo a cada instancia de la clase, algo como esto

Primera conexión:

 $facebook = new Facebook(array( 'appId' => APP_ID, 'secret'=> APP_SECRET )); $uid = $facebook->getUser(); if($uid){ $_SESSION['access_token']=$facebook->getAccessToken(); } 

Cualquier otro uso de la api:

 $facebook = new Facebook(array( 'appId' => APP_ID, 'secret'=> APP_SECRET )); $facebook->setAccessToken($_SESSION['access_token']); try{ $user_info = $facebook->api('/'.$uid.'?fields=id,name,first_name,last_name,email,picture'); } catch(FacebookApiException $e){ $error = $e->getMessage(); } 

Hasta ahora ha resuelto el problema

Editar 2
no … a veces mi token de acceso es una cadena alfanumérica válida de +100 caracteres y esas veces funciona.

A veces es una cadena de 48 solo números, y no … estoy realmente sorprendido aquí

La razón por la que esto probablemente ocurra es debido a los “Cambios de última hora” del 5 de diciembre de 2012 que Facebook ha implementado. Específicamente:

Nuevas restricciones de seguridad para los códigos de autorización de OAuth

Solo permitiremos que los códigos de autorización se intercambien por tokens de acceso una vez y se requerirá que se canjeen por un token de acceso dentro de los 10 minutos de su creación . Esto está en línea con la especificación OAuth 2.0 que desde el principio ha declarado que “los códigos de autorización DEBEN ser de corta duración y de un solo uso”. Para obtener más información, consulte nuestra documentación de autenticación.

Es por eso que su primera solicitud funciona, la segunda no. En el segundo bash, el SDK intenta intercambiar el código de autenticación del usuario por un token de acceso. Pero debido a estos cambios, esto solo se puede hacer una vez. Su código parece que debería funcionar correctamente, ya que está guardando explícitamente y luego configurando access_token después de que lo haya recibido por primera vez. Asegúrese de que ese sea el caso (confirme que la var $ _SESSION se está guardando / recuperando correctamente). Si por alguna razón no es así, el error 102 es lo que verá.

Aclamaciones