La conexión no tiene vencimiento: dura hasta que el propietario la desconecta, tu app la revoca o Craqui la
desconecta por seguridad. Si Craqui suspende tu app, la conexión queda en pausa y vuelve a funcionar cuando la
reactivamos. Mientras tu app use el refresh token al menos una vez cada 90 días, la conexión sigue viva.
Los dos tokens son opacos: no intentes leer nada de ellos. Para saber de qué negocio es un par, guárdalo junto al
business_id que vino en la respuesta de /oauth/token.
Renueva el access token
Cuando el access token vence, la API responde401 invalid_access_token. No
esperes a eso: renuévalo un poco antes de la hora, con el refresh token de ese negocio.
El refresh token rota en cada uso
Cada renovación te devuelve un refresh token nuevo, y el que usaste deja de servir. Por eso:- Guarda el refresh token nuevo antes de usar el access token nuevo, en la misma operación en tu base de datos. Si tu proceso se cae entre una cosa y la otra y te quedas con el refresh viejo, puedes perder la conexión (salvo dentro del margen de 60 segundos de abajo).
- Un solo renovador por negocio. Si dos procesos de tu app renuevan a la vez el mismo refresh token, uno
de los dos se queda con tokens que ya no sirven y, cuando presenta ese refresh, se trata como un robo y la
conexión se corta (abajo). Serializa la renovación por
business_id: un lock en tu base de datos, una cola, o un único proceso que renueva. - No guardes tokens viejos. Un refresh que ya usaste no te sirve para nada, salvo en el margen de abajo.
oauth4webapi, siguiendo el ejemplo de Conectar un negocio:
Si la respuesta se perdió: el margen de 60 segundos
Si mandaste la renovación y no te llegó la respuesta (se cortó la red, se cayó tu proceso), puedes repetirla con el mismo refresh token. Craqui la acepta si pasa todo esto:- pasaron menos de 60 segundos desde la renovación anterior;
- el access token que te dio esa renovación nunca se usó en la API.
Reutilización: la conexión se corta
Si llega un refresh token que ya se había cambiado por otro, y no es el reintento de arriba, Craqui supone que alguien lo robó: desconecta la conexión entera. Todos los tokens de ese negocio dejan de funcionar, la respuesta esinvalid_grant, y el propietario ve en sus aplicaciones conectadas que se desconectó por seguridad.
Para volver, el propietario tiene que conectar tu app otra vez desde tu web.
Lo mismo pasa si un código de autorización se presenta dos veces.
Qué hacer ante invalid_grant
/oauth/token responde 400 con error: "invalid_grant" cuando el refresh token (o el código) no sirve: venció,
se revocó, la conexión se desconectó, se reutilizó, o es de otra app. La respuesta no dice cuál de todas.
- No reintentes con el mismo refresh token: no va a funcionar.
- Marca la conexión con ese negocio como desconectada en tu sistema.
- Muéstrale al propietario un botón para volver a conectar tu app, que lo lleve por el flujo de Conectar un negocio.
401 con error: "invalid_client", el problema no es el token sino tu app: su secreto no
es válido o fue revocado, o Craqui suspendió tu app. Lee Errores y límites.
Los permisos de un token renovado
Un token renovado tiene los permisos de la conexión, nunca más de los que tenía el anterior. Leescope en
cada respuesta: si cambió, actualiza lo que tu app ofrece en ese negocio. Lee Permisos.
Desconecta un negocio
Cuando un negocio da de baja tu servicio, o ya no lo necesitas, revoca su conexión. Revocar el refresh token desconecta el negocio entero: sus tokens dejan de funcionar y el propietario la ve como desconectada en sus aplicaciones conectadas.- La respuesta es
200sin cuerpo, también si el token ya estaba revocado o no es de tu app (RFC 7009). - Revocar un access token corta solo ese token; la conexión y su refresh siguen.
- Después de revocar, borra los tokens de ese negocio de tu base de datos.
oauth4webapi:
Cuando el negocio desconecta tu app
El propietario puede desconectar tu app en cualquier momento desde su panel. Desde ese momento, en menos de un minuto:- la API responde
401app_connection_revokeda los access tokens de ese negocio; /oauth/tokenrespondeinvalid_grantal refresh token.
invalid_grant: marca la conexión
como desconectada y ofrece volver a conectar.
