Por qué existe OAuth aquí
Tu aplicación ya puede hacer todo lo que ofrece la API de Fluz en tu propia cuenta. Generas un token con tu clave de API y listo — ver Autenticación y Credenciales de API. Una aplicación OAuth es lo que necesitas cuando la cuenta no es tuya. En el momento en que quieras emitir una tarjeta en la billetera de un cliente, extraer de su cuenta bancaria vinculada, leer sus transacciones o pagarle, necesitas el permiso explícito de esa persona — y lo necesitas en una forma que Fluz pueda verificar, acotar (scope), expirar y revocar. Eso es una aplicación OAuth: una identidad registrada para tu software, más un mecanismo de consentimiento que convierte la aprobación de un usuario en un token que tu servidor puede usar.createVirtualCard con tu propio token crea una tarjeta en tu billetera; la misma mutación con un token del cliente la crea en la suya. OAuth cambia de quién es la cuenta que tocas, no lo que puedes hacer.¿Necesitas una?
- No — solo tu propia cuenta
- Sí — cuentas de clientes
- Ya tienes una
generateUserAccessToken directamente. Sin app OAuth, sin pantalla de consentimiento, sin redirección. Comienza en Credenciales de API.Tres conjuntos de credenciales, tres trabajos distintos
La fuente de confusión más común en esta sección es que una aplicación de Fluz lleva más de un par de credenciales, y no son intercambiables.El modelo de permisos
Fluz aplica permisos en dos niveles, y el acceso efectivo de una aplicación es la intersección de ambos.Otorgamiento a nivel de app — el techo
PCI_COMPLIANCE se otorga solo a nivel de aplicación, a desarrolladores que hayan demostrado cumplimiento con PCI DSS, y no puede solicitarse al generar un token.Otorgamiento a nivel de usuario — el piso
Ambos deben estar vigentes
generateUserAccessToken, no en tiempo de llamada. Ambos otorgamientos deben existir y no haber expirado. Un otorgamiento revocado o vencido, por lo tanto, aparece como un fallo de generación de token, no como un error de permiso a mitad de un flujo — que suele ser el primer lugar a revisar cuando una integración que funcionaba deja de hacerlo.getApplicationScopes para leer lo que está otorgado actualmente. Referencia completa: Application Scopes.
El ciclo de vida, de extremo a extremo
Cada paso a continuación es una página de inmersión profunda en esta sección. Este es el mapa; las páginas son el territorio.Crea la app
Configúrala
Envía al usuario a autorizar
/authorize con response_type=code, tu client_id, un redirect_uri registrado, una lista de scopes delimitada por espacios y un valor opcional state que quieres que te devuelvan intacto.→ Flujo de otorgamiento OAuth orientado al clienteRecibe el código
redirect_uri con code y tu state original. En caso de una mala configuración, la redirección lleva un mensaje de error que describe lo que no coincidió.Intercambia el código por tokens
/token/exchange con el code y el mismo redirect_uri exacto, autenticado con Authorization: Basic base64(client_id:client_secret). Recibirás un accessToken, un refreshToken, marcas de tiempo de expiración y el arreglo de scopes confirmados.→ Intercambiar un código de autorización OAuthRefresca, no vuelvas a pedir permiso
/token/refresh con el refresh_token y el mismo encabezado Basic auth. Los access tokens son deliberadamente de corta duración — del orden de diez minutos — mientras que los refresh tokens duran aproximadamente un mes. Refresca silenciosamente en segundo plano; solo vuelve a enviar a un usuario por consentimiento cuando el refresh token haya expirado o el otorgamiento haya sido revocado.→ Refrescar un OAuth accessTokenPasa a producción
Reglas que muerden
Vale la pena interiorizarlas antes de comenzar, porque cada una de estas falla de forma silenciosa o confusa.Los Redirect URIs deben coincidir exactamente — dos veces
Los Redirect URIs deben coincidir exactamente — dos veces
redirect_uri que envías a /authorize debe estar registrado en tu app, y el que envías a /token/exchange debe ser idéntico byte a byte al que usaste en /authorize. Las barras finales, http vs https, y el uso de mayúsculas en el host cuentan. No registres parámetros de query en el propio URI — usa state para llevar contexto.Los scopes no habilitados se ignoran, no se rechazan
Los scopes no habilitados se ignoran, no se rechazan
scope en la respuesta del intercambio y trátalo, no a tu solicitud, como la verdad sobre lo que puedes hacer.Un código de autorización es de un solo uso y corta vida
Un código de autorización es de un solo uso y corta vida
La autenticación Basic es base64 del par, no de cada parte
La autenticación Basic es base64 del par, no de cada parte
Authorization: Basic <base64(client_id + ":" + client_secret)>. Codifica la cadena unida. La mayoría de los fallos de integración en el paso de intercambio se deben a esto.`state` es tu único canal de retorno
`state` es tu único canal de retorno
state. No pongas nada sensible allí — viaja a través del navegador del usuario.Las fallas de token suelen ser fallas de otorgamiento
Las fallas de token suelen ser fallas de otorgamiento
generateUserAccessToken empieza a fallar para un usuario que funcionaba ayer, verifica si el otorgamiento a nivel de app o a nivel de usuario expiró o fue revocado, antes de revisar tu código.