obtener - ¿Hay alguna forma de comprobar si el token de acceso de Facebook sigue siendo válido?
obtener access token facebook (10)
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.
Actualizando esto ya que las cosas han cambiado desde OP:
Puede depurar los tokens de acceso aquí: https://developers.facebook.com/tools/debug/accesstoken?version=v2.5&q= {access_token}
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:
(Enlace antiguo, desactualizado. Consulte a continuación) 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/
Fuera de línea - no es posible
Pida que el usuario haya dado permiso o no:
https://graph.facebook.com/{facebook-id}/permissions?access_token={access-teken}
si el token de acceso no es válido, dará error:
{
error: {
message: "The access token could not be decrypted",
type: "OAuthException",
code: 190
}
}
De lo contrario, dará la lista de permisos que el usuario ha dado:
data: [
{
installed: 1,
...... permission list.........
bookmarked: 1
}
],
La respuesta de Otto a la publicación de Facebook parece ser la respuesta oficial a esta pregunta, sin embargo, usa PHP directamente en lugar del SDK y también usa 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 verifica el objeto me con la API gráfica. Si se lanza una excepción, destruye * la sesión actual de Facebook.
try{
$facebook->api(''/me'');
}
catch( FacebookApiException $e ){
$facebook->destroySession();
}
Esto fuerza llamadas de gráficos posteriores para crear una nueva sesión de Facebook. Esto al menos le da acceso a datos públicos para que pueda representar páginas que no requieren permisos de usuario de FB:
$facebook->api(''/userName'');
Para volver a obtener el permiso de usuario, el usuario deberá iniciar sesión en su aplicación (esto es distinto de haber iniciado sesión en Facebook). Puedes hacer esto con JS o con PHP:
$facebook->getLoginUrl();
* Tenga en cuenta que la llamada destroySession () todavía no se encuentra en una versión etiquetada del PHP SDK. Use la rama principal o remóchela.
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 eliminó su aplicación, sabría que el token de acceso ha caducado.
Las actualizaciones en tiempo real son en realidad la manera recomendada por facebook de manejar los 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.
Puede verificar el token utilizando el servicio de depuración de tokens, eche un vistazo aquí
https://graph.facebook.com/debug_token?input_token=INPUT_TOKEN&access_token=ACCESS_TOKEN
https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/
Revisé estas publicaciones, encontré muy buenas soluciones como esta:
GET graph.facebook.com/debug_token?
input_token={token-to-inspect}
&access_token={app_id}|{app_secret}
La respuesta de esta solicitud le proporciona todo lo que necesita:
- su ID de aplicación : esto verifica que el token proviene de su aplicación
- nombre de la aplicación , que también se puede verificar
- expires_at - tiempo de expiración del token
- is_valid - boolean para chequeo
- user_id - que también puedes comparar y verificar
Solo tenga en cuenta que "|" el signo debe estar allí como una carta
Si desea saber el tiempo de caducidad del token, puede pasar una url de gráfico abierto usando appid y token, como se muestra a continuación, funcionará.
https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx
Sin conexión, sin enviar nada a Facebook, no lo creo. La forma más fácil es, probablemente, enviar una solicitud a:
https://graph.facebook.com/me?access_token=...
Facebook también admite suscripciones para actualizaciones en real-time real, pero no estoy seguro de cómo aplicarlas a esta situación.
//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;
}