2011-07-15 33 views
13

Estoy trabajando desde this reference y tratando de implementar el protocolo OAuth para permitir a los usuarios iniciar sesión en mi sitio a través de Facebook. Sin embargo, la documentación de Facebook es bastante terrible y no está claro en algunas partes clave.¿Cómo se renueva un token de acceso de Facebook caducado?

Se dice que la autorización tiene tres pasos:

  1. autenticación de usuario (redirigir al usuario a https://facebook.com/dialog/oauth?client_id=...&redirect_uri=..., y esperan que la página redirect_uri a ser llamado de nuevo con un code). ¡Funciona genial!

  2. Autorización de la aplicación (gestionada por Facebook, etc.). ¡Funciona genial!

  3. autenticación de Aplicación (En la página de devolución de llamada, agarrar el code que se obtiene y llama https://graph.facebook.com/oauth/access_token?client_id=...&redirect_uri=...&client_secret=...&code=.... El cuerpo de la respuesta incluirá una access_token que tenemos que hacer las cosas)

entiendo que con la access_token , Puedo llamar a las API y tal. Pero, ¿qué sucede cuando expira? Podría obtener uno nuevo, pero en este punto serán muchas las solicitudes HTTP posteriores, y ya no tengo el code que solía obtener en primer lugar. ¿Debo guardar el code junto con el access_token? O bien, ¿tengo que decirle al usuario que vuelva a iniciar sesión para obtener un nuevo code y obtener un nuevo access_token?

O, ¿me falta una parte clave aquí? No necesito un token offline_access, ya que solo voy a sondear los datos en respuesta a las acciones del usuario.

Respuesta

25

Cuando expira el access_token, el usuario será visto como "desconectado" por Facebook. Su aplicación pasará por el mismo proceso que la primera vez, pero es posible que el usuario no lo haga.

Si el usuario no ha revocado el acceso a su aplicación, y el usuario ha iniciado sesión en Facebook en ese momento, el proceso de Autorización de la aplicación se resolverá solo, sin acciones requeridas por el usuario y recibirá una nuevo access_token.

Si el usuario no ha revocado el acceso a su aplicación, pero no ha iniciado sesión en Facebook, se les presentará un inicio de sesión de Facebook en el paso Autorización de la aplicación. No se les pedirá que vuelvan a dar permiso a su aplicación, ya que Facebook sabe que su ID de la aplicación está autorizada por ese usuario.

Finalmente, si el usuario ha revocado el acceso, se le presentará la solicitud original de Autorización de la aplicación y usted seguirá el flujo original.

Esencialmente, usted debe considerar el access_token tan volátil, y no molestar almacenarla, pero utilizando el access_token que recibe como parte del proceso de inicio de sesión de usuario, lo que está sucediendo detrás de las escenas de todo el tiempo, y sólo implica al usuario cuando cierran sesión en Facebook o revocan el acceso a su aplicación.

Esto es diferente de OAuth de Twitter con el que puede almacenarlo y reutilizarlo.

+0

Así que, espera, ¿estás diciendo que debería volver a autenticarte en cada carga de página? ¿No duplicará eso el número de solicitudes a mi servidor? –

+1

Solo necesita volver a autenticarse cuando expira access_token. La respuesta en la que obtienes access_token también incluye un parámetro de caducidad que es el número de segundos hasta que expira access_token. Ya sabes cuándo se emite el token, así que todo lo que tienes que hacer es verificar si ha expirado en función de la cantidad de segundos. Si lo tiene, consigue uno nuevo. Si no lo ha hecho, continúe usándolo. – Owen

+0

Oh, está bien. Afortunadamente, esta es la conclusión a la que vine antes. Simplemente inserto una redirección al comienzo del procedimiento OAuth cuando caduca el token. –

5

De la documentación Facebook vinculado en su pregunta:

Una vez que la señal caduca, tendrá que volver a ejecutar los pasos anteriores para generar un nuevo código y señal_acceso, aunque si el usuario ya ha autorizó su aplicación, no se les pedirá que lo hagan de nuevo.

Cuando caduque el access_token, deberá obtener uno nuevo siguiendo los mismos pasos. El usuario deberá iniciar sesión de nuevo y deberá obtener un nuevo code y, a su vez, un nuevo access_token.

Cuestiones relacionadas