Cómo implementar la autenticación OAuth y la gestión de tokens en Etendo RX
Visión general
Esta guía describe cómo integrar la autenticación de inicio de sesión único (SSO) y la gestión de tokens de acceso OAuth 2.0 entre Etendo RX (ERP) y un Middleware externo (EtendoAuth) que intermedia la identidad (Auth0 u otro IdP OpenID Connect) y las APIs de Google (Drive, Picker, etc.).
Cubre la arquitectura, el modelo de datos, el flujo de autenticación, la obtención de tokens, la persistencia, la renovación, el manejo de errores, los procedimientos operativos, las referencias de código y una lista de verificación de soporte.
1. Arquitectura y responsabilidades
Etendo RX (ERP)
- Mantiene la configuración de proveedores OAuth (endpoints, credenciales, scopes).
- Delega la autenticación de usuario y los flujos de consentimiento OAuth de Google al Middleware cuando está configurado.
- Persiste los tokens de acceso recibidos y los metadatos relacionados.
- Limpia los tokens anteriores para el mismo usuario + proveedor antes de guardar uno nuevo.
Middleware (EtendoAuth)
- Proporciona SSO mediante Auth0 (o cualquier IdP OIDC): construye la URL de autorización, intercambia el código de autorización, valida el ID Token (JWKS) y devuelve el control al ERP.
- Orquesta el consentimiento OAuth 2.0 de Google y el intercambio / refresco de tokens.
- Emite códigos de autorización internos de corta duración (efímeros) para un intercambio seguro por canal de backchannel (opcional).
- Almacena los refresh tokens de forma segura (en producción use una base de datos cifrada, no un mapa en memoria).
Modelo de datos (Etendo RX)
| Tabla | Propósito |
|---|---|
ETRX_OAUTH_PROVIDER |
Metadatos del proveedor OAuth (client id/secret, endpoints, tipo de grant, URI de redirección, URI de userinfo, URL de JWKS, scopes, flags). |
ETRX_TOKEN_INFO |
Token de acceso, validez, contexto de scope del proveedor, vinculación con el usuario, flags (p. ej. APPROVE_GOOGLE_DOC). |
ETRX_TOKEN_USER |
Relación usuario ↔ token según el modelo de seguridad. |
ETRX_INSTANCE_CONNECTOR |
Registro de instancia de middleware externa (URL base, tipo de autorización, credenciales/token si se requiere). |
2. Flujo de autenticación (SSO vía Auth0)
Objetivo: autenticar al usuario y, opcionalmente, devolver un código interno de corta duración para la vinculación de sesión del ERP.
Secuencia de alto nivel:
- El ERP redirige al usuario al Middleware
/login?provider=auth0&redirect_uri=<erp_return>&account_id=<account>. - El Middleware construye la URL de Auth0
/authorize(scope:openid profile email) y redirige al usuario. - El IdP (Auth0) autentica al usuario y redirige al Middleware
/callback?code=...&state=.... - El Middleware intercambia
codepor tokens (id_token,access_token). - El Middleware valida la firma de
id_token(JWKS), el issuer, el audience,exp,iat. - El Middleware redirige al
redirect_urioriginal del ERP con información del usuario o con uncodeinterno efímero (si se utiliza el flujo/authorize). - El ERP (opcional) hace POST del
codeefímero a/authorizepara recuperar claims (sub, email, account). - El ERP crea / actualiza la sesión interna y asocia el usuario.
Notas:
- El ERP también puede aceptar Bearer JWT directamente en las solicitudes entrantes (las pruebas referencian SWSAuthenticationManagerTest).
- Los códigos efímeros se almacenan durante un TTL corto (p. ej. 10 minutos) en el almacén en memoria del Middleware.
3. Generación y gestión de tokens OAuth (Google)
Objetivo: obtener y mantener tokens de acceso válidos para las APIs de Google (p. ej. scope de Drive drive.file).
Secuencia de alto nivel:
- El usuario dispara la acción "Obtener token del Middleware" en el ERP y selecciona un scope.
- El ERP construye un payload
state{ userId, redirect }(redirect = endpoint del servlet del ERPSaveTokenFromMiddleware). - El ERP redirige al Middleware
/oauth/google/start?state=<base64url>. - El Middleware decide si solicitar consentimiento (refresh token ausente o primera vez) y redirige al endpoint de autorización de Google.
- Google vuelve al Middleware
/oauth/google/callback?code=...&state=.... - El Middleware intercambia el código de autorización en
https://oauth2.googleapis.com/token. - El Middleware almacena el
refresh_token(si es nuevo) y elaccess_tokenactual con su expiración. - El Middleware redirige al ERP a la URL
redirectcon parámetros de token (o de error). - El servlet del ERP
SaveTokenFromMiddlewarepersiste el token enETRX_TOKEN_INFO(tras eliminar el token anterior para el mismo usuario/proveedor).
Refresco transparente:
- La función del Middleware ensureAccessToken(userId) comprueba la expiración; si está expirado, usa el refresh_token almacenado para obtener un nuevo access_token y actualiza la caché.
4. Configuración del ERP (Etendo RX)
ETRX_OAUTH_PROVIDER
Campos clave:
AUTHORIZATION_URI,TOKEN_URI,USER_INFO_URI,JWKSETURICLIENT_ID,CLIENT_SECRET,REDIRECT_URIAUTHORIZATION_GRANT_TYPE(p. ej.authorization_code)CLIENT_AUTHENTICATION_METHOD(p. ej.client_secret_basic)CODE_CHALLENGE_METHOD(PKCES256si es un cliente público)USERNAMEATTRIBUTE(p. ej.emailosub)PROVIDER_SCOPEGET_MIDDLEWARE_TOKEN(flag para delegar al flujo predefinido del Middleware)
ETRX_TOKEN_INFO
Almacena:
AD_USER_ID,ETRX_OAUTH_PROVIDER_IDTOKEN(token de acceso),VALID_UNTILMIDDLEWARE_PROVIDER(p. ej.google - drive.file)- Flags (p. ej.
APPROVE_GOOGLE_DOC)
ETRX_INSTANCE_CONNECTOR
Registra:
- URL base del Middleware
- Tipo de autorización y credenciales (token / usuario y contraseña basic)
5. Resumen de endpoints del Middleware
| Endpoint | Método | Propósito |
|---|---|---|
/login |
GET | Iniciar SSO con Auth0. Parámetros: provider, redirect_uri, account_id? |
/callback |
GET | Callback de Auth0: intercambiar código → tokens, validar JWT, redirigir al ERP |
/authorize |
POST | Intercambiar código interno efímero por claims del usuario (backchannel seguro) |
/oauth/google/start |
GET | Iniciar consentimiento de Google. Requiere state |
/oauth/google/callback |
GET | Intercambiar código de Google → tokens; redirigir al ERP |
/picker |
GET | Ejemplo de Google Picker; asegura un token de acceso válido |
/jwks |
GET | Exposición de JWKS (si el Middleware firma tokens) |
/logout, /register |
Var | Flujos secundarios |
6. Manejo de errores y trazabilidad
Middleware
- Prefijos de log estructurados:
[LOGIN],[CALLBACK],[AUTHORIZE],[GOOGLE]. -
Errores comunes:
-
Falta
state→ 400 - Falta
refresh_tokeny no hay ninguno en caché → 400 - Fallo en el intercambio de token → 500 (
token_exchange_failed) - Firma / audience / issuer inválidos del ID Token → 401
ERP
SaveTokenFromMiddlewareinterpreta los parámetros de queryerroryerror_description.- Convierte códigos técnicos (p. ej.
access_denied) en mensajes amigables para el usuario. - Elimina los registros de tokens anteriores antes de insertar (evitar duplicados / tokens obsoletos).
7. Buenas prácticas de implementación
Seguridad:
- Imponga HTTPS de extremo a extremo.
- Mantenga el
refresh_tokensolo en el Middleware (no expuesto a la UI del ERP). Proporcione únicamente tokens de acceso cuando sea estrictamente necesario. - Valide
iss,aud,exp,iatde los ID Tokens. - Limite los scopes (principio de mínimo privilegio, p. ej.
drive.file). - Rote los client secrets; almacénelos en un gestor de secretos.
- Use PKCE (
S256) para clientes públicos. - Configure CORS estricto y cookies seguras.
Fiabilidad:
- Sustituya el almacén de tokens en memoria por almacenamiento persistente cifrado en producción.
- Sincronice relojes (evitar rechazos por expiración prematura).
- Implemente reintentos con backoff para errores de red transitorios hacia Google / Auth0.
Observabilidad:
- Correlacione logs usando un ID de solicitud propagado desde ERP → Middleware.
- Enmascare valores sensibles (tokens, client secrets) en los logs.
8. Procedimiento operativo (paso a paso)
A. Registrar proveedor OAuth en el ERP
- Cree un registro en
ETRX_OAUTH_PROVIDERcon endpoints y credenciales del IdP. - Configure
REDIRECT_URIal endpoint del servlet del ERP que gestiona el retorno del token (p. ej./etendorx/SaveTokenFromMiddleware). - Habilite
GET_MIDDLEWARE_TOKENsi delega la obtención del token al Middleware. - (Opcional) Configure
JWKSETURIpara validación directa de JWT.
B. Probar SSO (Auth0)
- Dispare la acción de SSO del ERP → llama al Middleware
/login. - Autentíquese mediante Auth0 → vuelve al Middleware
/callback→ redirige al ERP. - Confirme que se crea la sesión del ERP y que el usuario se mapea por
emailosub.
C. Obtener token de Google (ejemplo de Drive)
- En el ERP invoque la acción "Obtener token del Middleware" seleccionando el scope (p. ej.
drive.file). - Flujo:
/oauth/google/start→ consentimiento de Google →/oauth/google/callback→ redirección al ERP. - Valide una nueva entrada en
ETRX_TOKEN_INFOcon el valor correcto deMIDDLEWARE_PROVIDERy su expiración. - Pruebe la integración con la API de Google / Picker; el Middleware refresca los tokens de forma transparente.
9. Referencias de código
ERP (Etendo RX)
- Servlet:
src/com/etendoerp/etendorx/SaveTokenFromMiddleware.java -
Tablas:
-
src-db/database/model/tables/ETRX_OAUTH_PROVIDER.xml src-db/database/model/tables/ETRX_TOKEN_INFO.xmlsrc-db/database/model/tables/ETRX_TOKEN_USER.xmlsrc-db/database/model/tables/ETRX_INSTANCE_CONNECTOR.xml
Middleware (EtendoAuth)
- Rutas de Auth0:
src/routes/login.ts,src/routes/callback.ts,src/routes/authorize.ts - Servicio de Auth0:
src/services/auth0.ts(URL de autorización, intercambio de token, validación de JWT) - Rutas de Google:
src/routes/oauth_google.ts - Lógica de Google:
src/googleAuth.ts(exchangeCodeForTokens,ensureAccessToken,refreshAccessToken) - Almacén de tokens (sustituir en producción):
src/tokenStore.ts - Ejemplo de Google Picker:
src/routes/picker.ts
10. Lista de verificación de soporte
- Variables de entorno de Auth0:
AUTH0_DOMAIN,AUTH0_CLIENT_ID,AUTH0_CLIENT_SECRETconfiguradas. - Variables de entorno de Google:
GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GOOGLE_REDIRECT_URI,GOOGLE_API_KEYconfiguradas. - ERP
ETRX_OAUTH_PROVIDERconfigurado oGET_MIDDLEWARE_TOKEN = Y. - URL base del Middleware registrada en
ETRX_INSTANCE_CONNECTOR(si se utiliza). REDIRECT_URIcoincide con la configuración del IdP y de la consola de Google.- Relojes del sistema sincronizados.
- Certificados TLS válidos.
- Los logs del Middleware muestran la secuencia esperada
[LOGIN]→[CALLBACK]. - En errores
access_denied: verifique el consentimiento del usuario, los scopes y la política del IdP.
Resumen
Este documento centraliza los pasos y las estructuras necesarias para implementar SSO OAuth seguro y la gestión de tokens de Google en Etendo RX usando una capa de Middleware dedicada. Siga las buenas prácticas para garantizar seguridad, fiabilidad y mantenibilidad.
This work is licensed under CC BY-SA 2.5 ES by Futit Services S.L..