2010-10-02 29 views
69

Mi sitio utiliza tokens de acceso de por vida (offline_access). Sin embargo, si el usuario cambia su contraseña, el token de acceso se restablece. ¿Hay algún método para verificar si el token de acceso actual es válido antes de realizar llamadas a Graph API? Gracias por tu tiempo.¿Hay alguna forma de comprobar si el token de acceso de Facebook sigue siendo válido?

+0

Ninguna de las respuestas publicadas aquí funcionó para mí. Sin embargo, esta respuesta fue: https://stackoverflow.com/a/41465468/763010 –

Respuesta

36

Básicamente, FB quiere que lo sondee, o que detecte el caso y redirija al usuario para que se realice una reautorización. Molesto, pero oficial:

(. Viejo, enlace obsoleto Véase más abajo)https://developers.facebook.com/blog/post/500/

Editar: Facebook cambió su estructura de enlace sin redirecciones. No sorprendido.

https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens/

+0

Lo sentimos, es posible que el enlace que siguió esté roto o que la página se haya eliminado. –

+0

Agregó el nuevo enlace. – Otto

+11

+1 para el comentario "No me sorprende". :) "Muévete rápido y rompe cosas" podría ser una filosofía increíble para las empresas de Facebook, pero seguro que nos hace la vida difícil ... – rinogo

66

Sin conexión, sin enviar nada a Facebook - No lo creo. La forma más sencilla es probablemente para enviar una petición a:

https://graph.facebook.com/me?access_token=... 

Facebook también es compatible con las suscripciones de real-time actualizaciones, pero no estoy seguro de cómo aplicarlos a esta situación.

4

Las actualizaciones en tiempo real le permitirían resolver este problema, pero sería bastante complicado. Básicamente, puede suscribirse a las actualizaciones que le dirán 1) si el usuario eliminó la aplicación o 2) si el usuario eliminó los permisos. Puede usar esto para almacenar los permisos actuales del usuario de faceboook. De esta forma, si el usuario eliminara su aplicación, sabría que el token de acceso ha caducado.

Actualizaciones en tiempo real es en realidad facebooks manera recomendada de manejar permisos. Muchas aplicaciones hacen llamadas de API cada vez que se carga una página para verificar los permisos. Esto tiende a ser lento y poco confiable.

+3

¿Qué pasa cuando el usuario cambia su contraseña? – Ashfame

-6

respuesta de la publicación en Facebook de Otto parece ser la respuesta oficial sobre esta cuestión, sin embargo, utiliza PHP recta en lugar del SDK y también utiliza JS para resolver el problema en lugar de PHP. Si usa PHP para verificar una sesión válida, a menudo necesita un método PHP para garantizar una sesión válida y poder continuar.

El siguiente código comprueba el objeto me con la API de gráfico. Si se lanza una excepción, destruye * la sesión actual de Facebook.

try{ 
    $facebook->api('/me'); 
} 
catch(FacebookApiException $e){ 
    $facebook->destroySession(); 
} 

Esto fuerza las llamadas de gráficos posteriores para crear una nueva sesión de Facebook. Esto al menos le da acceso a los datos públicos para que pueda representar páginas no requieren permisos de usuario FB:

$facebook->api('/userName'); 

Para reobtain los permisos de acceso de usuario necesitará el usuario para acceder a su aplicación (esto es distinto del que se registren en Facebook mismo). Usted puede hacer esto con JS o con PHP:

$facebook->getLoginUrl(); 

* Nota del destroySession() llamada no está en una versión etiquetada del SDK PHP todavía. Use la rama principal o remítalo.

43

Si desea conocer el tiempo de caducidad del token puede pasar una url de gráfico abierto usando appid y token como a continuación, funcionará.

https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx 
+1

El parámetro 'client_id' aquí no hace nada. Puedes dejarlo fuera. – Jeroen

7
+0

Aunque la respuesta de Chaitanya Bharat es más simple y funciona bien en la mayoría de los casos, este enfoque parece ser el mejor para mí. – x1a0

+3

¿Qué es un token de entrada? –

+0

https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens – truongnm

1
 //When user access token expires user must be logged in and renew the access token him self.it is a Facebook policy 
     //you can overcome this by sending email to users who have expired access token. 
     //create a table of successful sending to monitor sending process 
     //if any failure happened with the user an email is sent to him to ask him to activate there account again.with a link to your subscription page. 
     //and here is the code should be written on that page. 
     $app_id = "YOUR_APP_ID"; 
     $app_secret = "YOUR_APP_SECRET"; 
     $my_url = "YOUR_POST_LOGIN_URL"; 

     // known valid access token stored in a database 
     $access_token = "YOUR_STORED_ACCESS_TOKEN"; 

     $code = $_REQUEST["code"]; 

     // If we get a code, it means that we have re-authed the user 
     //and can get a valid access_token. 
     if (isset($code)) { 
     $token_url="https://graph.facebook.com/oauth/access_token?client_id=" 
      . $app_id . "&redirect_uri=" . urlencode($my_url) 
      . "&client_secret=" . $app_secret 
      . "&code=" . $code . "&display=popup"; 
     $response = file_get_contents($token_url); 
     $params = null; 
     parse_str($response, $params); 
     $access_token = $params['access_token']; 
     } 


     // Attempt to query the graph: 
     $graph_url = "https://graph.facebook.com/me?" 
     . "access_token=" . $access_token; 
     $response = curl_get_file_contents($graph_url); 
     $decoded_response = json_decode($response); 

     //Check for errors 
     if ($decoded_response->error) { 
     // check to see if this is an oAuth error: 
     if ($decoded_response->error->type== "OAuthException") { 
      // Retrieving a valid access token. 
      $dialog_url= "https://www.facebook.com/dialog/oauth?" 
      . "client_id=" . $app_id 
      . "&redirect_uri=" . urlencode($my_url); 
      echo("<script> top.location.href='" . $dialog_url 
      . "'</script>"); 
     } 
     else { 
      echo "other error has happened"; 
     } 
     } 
     else { 
     // success 
     echo("success" . $decoded_response->name); 
     echo($access_token); 
     } 

     // note this wrapper function exists in order to circumvent PHP's 
     //strict obeying of HTTP error codes. In this case, Facebook 
     //returns error code 400 which PHP obeys and wipes out 
     //the response. 
     function curl_get_file_contents($URL) { 
     $c = curl_init(); 
     curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($c, CURLOPT_URL, $URL); 
     $contents = curl_exec($c); 
     $err = curl_getinfo($c,CURLINFO_HTTP_CODE); 
     curl_close($c); 
     if ($contents) return $contents; 
     else return FALSE; 
     } 
1

sin conexión - no es posible

Haz ese usuario ha dado permiso o no:

https://graph.facebook.com/{facebook-id}/permissions?access_token={access-teken} 

si token de acceso no es válido entonces se da el error:

{ 
error: { 
message: "The access token could not be decrypted", 
type: "OAuthException", 
code: 190 
} 
} 

de lo contrario se dará la lista de permisos que el usuario ha dado:

data: [ 
{ 
installed: 1, 
...... permission list......... 
bookmarked: 1 
} 
], 
1

Fui a través de estos mensajes, la yema me ha parecido muy buenas soluciones como esta:

GET graph.facebook.com/debug_token? 
    input_token={token-to-inspect} 
    &access_token={app_id}|{app_secret} 

respuesta de esta solicitud le proporciona todo lo que necesita:

  • su ID de aplicación - Esto verifica ese token es de su aplicación
  • nombre de la aplicación - que también se puede marcar
  • expires_at - tiempo de expiración símbolo
  • is_valid - booleanas para chequeo
  • user_id - que también se puede comparar y comprobar

Ten en cuenta que "|" el signo debe estar allí como una carta

Cuestiones relacionadas