¿Invalidando un token de acceso de Facebook?

¿Es posible invalidar un token de acceso de Facebook?

Necesito hacer esto debido a la reciente desaprobación de offline_access.

El problema es que el token no se puede extender más allá de los 60 días. Incluso si el usuario vuelve a la aplicación (a menos que esté malinterpretando)

Entonces, lo que quiero hacer es invalidar el token, luego volver a iniciar sesión de inmediato para que pueda recuperar un nuevo token de acceso, con una nueva fecha de vencimiento de 60 días. Mientras el usuario venga una vez cada dos meses, todo debería estar bien.

No quiero cerrar la sesión del usuario en Facebook, por lo que FB.logout no se puede utilizar.

¿Es eso posible?

preguntado el 22 de mayo de 12 a las 15:05

4 Respuestas

Puede enviar una solicitud de ELIMINACIÓN a /me/permissions que debería (creo) invalidar la sesión para el usuario.

Sin embargo, realmente no veo por qué quieres hacer eso. Simplemente puede usar la autenticación del lado del servidor que termina con un token de 60 días, independientemente del token que tenía antes. Entonces, cada vez que desee 60 días más, simplemente autentique al usuario mediante el proceso del lado del servidor.

contestado el 22 de mayo de 12 a las 15:05

Gracias, intentare Con respecto a su sugerencia, ¿está seguro de eso, re: "Tenga en cuenta que el punto final solo se puede usar para extender los access_tokens de usuario de corta duración. Si pasa un access_token que tuvo un tiempo de vencimiento prolongado, el punto final simplemente pasará ese mismo access_token de vuelta a usted sin alterar o extender el tiempo de caducidad". - por lo que no actualizará la fecha de vencimiento si ya es un token de acceso de vencimiento prolongado. - usuario429620

Sí, en el mismo lugar que dice (bajo "Escenario 3: Desarrolladores OAuth del lado del servidor"): If the call is made while there is still a valid long-lived user access_token for that user, the returned user access_token from this second call may be the same or may have changed, but in either case the expiration time will be set to a long expiration time. No puede usar un token de cliente aquí, solo uno de servidor. - nitzan tomer

Bueno, probé llamar al punto final varias veces, pero el tiempo de vencimiento no se actualizó. Aunque tal vez esto es porque no esperé un día? ¿Ya has usado esto en un proyecto? - usuario429620

Lo siento, está bien, enviar DELETE a /me/permissions funciona. Autorización eliminada. ¡ESTUPENDO! Sin embargo, aún no se seleccionará como la respuesta correcta, en caso de que haya una mejor manera. - usuario429620

En realidad, parece que se ha ido, pero después de iniciar sesión nuevamente, devuelve el mismo token de corta duración. Quizás solo tenga que esperar un par de horas... - user429620

Consideraría seriamente evitar el SDK de Javascript de Facebook como la plaga, ya que es asincrónico, lo que en realidad significa que Facebook es seguro pero su sitio web no lo es.

Recién comencé a reconstruir mi flujo de inicio de sesión y me pregunto si esta parte de mi código puede ser útil para administrar tokens de usuario:

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    $fb_error = $e->getResult();
    error_log($e);
    $user = null;
  }
}


//https://developers.facebook.com/docs/reference/api/errors/
switch ($fb_error['error']['error_subcode']) {
    case '458':
    //Returned on app trying something or user attempting an action after app deauth
    //Can do database cleannup operations from this
        $fb_error = '458 - User removed the app from user settings';
        break;
    case '460':
    //App is no longer reauthorized and the user is trying something ?
    //Stop user from all activities if this comes up as they may deauth then try perform an action
        $fb_error = '460 - User needs to reauthorize';
        break;
    case '463':
    //Expired Token
    //This is where we autolog the user back in
        $fb_error = '463 - Token has expired and a new one needs to be requested';
        //need to somehow get the login request code from another page to hide it
        //or use htaccess tricks
        $facebook->getAccessToken();
        break;
    case '467':
    //Invalid Token
    //This is where we autolog the user back in
        $fb_error = '467 - Token is invalid and a new one needs to be requested';
        break;
}

Puede enviar los errores a la página para probar:

echo 'Error Subcode: '.$fb_error.'<br/>';
echo 'Facebook Error Dump:<br/>';
var_dump($e);

Tenga en cuenta que el interruptor de PHP funciona como un solo if enunciado con múltiples respuestas (caso).

Recomendaría para la optimización de la velocidad del código reordenar el interruptor para que los errores más comunes se enumeren en la parte superior del interruptor, ya que la forma en que funciona el interruptor de PHP es recorrer la lista hasta que encuentre un caso que coincida con el código de error.

Respondido 26 Oct 13, 06:10

Según Facebook documentación, no necesitas hacer nada complicado.

En el proceso de inicio de sesión del usuario, recupere un token de acceso de corta duración y cámbielo por un token de acceso de larga duración, que es válido por 60 días.

Si un usuario cierra sesión e inicia sesión varias veces durante el día, recibirá el mismo token de acceso (probablemente) pero el tiempo de vencimiento no se actualizará. Pero después de pasar al menos un día, recibirá un nuevo token de acceso de larga duración con un nuevo tiempo de vencimiento.

El único problema posible es el escenario en el que el usuario inicia sesión constantemente durante más de dos meses (más de 60 días). Para tales escenarios (incluso eso es apenas posible) codifico una pequeña función de tiempo de espera que, cuando el token expire, lo renovará en segundo plano.

Refactoricé mi código para recuperar y usar tokens de larga duración ayer por la tarde, por lo que no pasó suficiente tiempo para estar seguro, pero de acuerdo con la documentación de Facebook mencionada, debería ser así.

Respondido 26 Oct 13, 06:10

No necesita invalidar el token de acceso.

Le devolverá un nuevo token extendido de 60 días si usa un Un nuevo token de acceso de corta duración para intercambiarlo. Ese token específico de corta duración siempre se le entrega cuando el usuario usa la aplicación nuevamente. Use el flujo de autenticación del lado del cliente (JS SDK) para asegurarse de obtener el token de corta duración. Use el nuevo punto final para intercambiar tokens.

Para obtener más información, consulte el documento de facebook.

contestado el 22 de mayo de 12 a las 15:05

Pero si utilizo el token de corta duración y luego lo intercambio a través del punto final, se devuelve el mismo antiguo token de larga duración (al que solo le quedan unos días antes de su vencimiento). (nota, todavía no he esperado un día antes de volver a intentarlo) - user429620

@dragonjet: ¿puede explicar qué significa "siempre se le otorga un token de corta duración cuando el usuario usa la aplicación nuevamente"? ¿Quién me lo da, cómo puedo conseguirlo? ¡Gracias! - avs099

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.