Auth y Deep Link en Native
Estado
Section titled “Estado”Flujo OAuth oficial orientado a BFF web.
- Ruta oficial actual:
native -> Zauru authorize -> deep link callback -> web BFF exchange. - PKCE: pendiente de soporte por proveedor.
- Happy path oficial: BFF-first.
directexiste solo como escape hatch técnico deprecated, no como setup normal del proyecto.- En esta fase, mobile no hace
graphql.jsonni GraphQL directo. - Mobile solo persiste metadata de
zauruSessionsi el BFF/backend la devuelve.
Qué pasa en development build vs producción
Section titled “Qué pasa en development build vs producción”- Development build (Expo Dev Client): al abrir por primera vez en iPhone puede aparecer una pantalla para pegar/abrir la URL de Metro. Es normal en dev y no aparece en producción.
- Producción (EAS/App Store/TestFlight): el bundle ya va embebido/actualizable por OTA; no existe ese panel de conexión a Metro.
Esquema esperado
Section titled “Esquema esperado”<app-scheme>://auth/callback
Ruta oficial de intercambio (BFF)
Section titled “Ruta oficial de intercambio (BFF)”- App abre
authorizeconredirect_uri=<app-scheme>://auth/callback. - Zauru devuelve
codeal deep link de la app. - App envía
codeal backend web:POST /api/mobile/auth/exchange
- Web valida/intercambia con proveedor usando
client_secretsolo en servidor. - Web exige validación adicional en BoostAPI.
- Web devuelve sesión mobile:
accessTokencortorefreshTokenrotativoexpiresAtusercon metadata de acceso de BoostAPIclientKind = "mobile"zauruSessionreal si backend ya la devuelve; si no, mobile usa un fallback controlado
- App persiste sesión en almacenamiento seguro.
Relación entre sesión CRM y sesión Zauru
Section titled “Relación entre sesión CRM y sesión Zauru”- La sesión general mobile sigue dependiendo de
accessToken + refreshToken. zauruSessiones metadata de capacidad para módulos Zauru-backed.- Mobile no guarda el JWT crudo de GraphQL en
SecureStore. - Biométricos siguen siendo solo unlock local.
- Mobile no resuelve Zauru por su cuenta; backend hace reconcile y expone snapshot.
- Si más adelante entra un módulo Zauru-backed a Expo, deberá reaccionar a:
missingreadyexpiring_soonexpiredentity_mismatchusando el snapshot ya devuelto por backend/BFF.
Variables mínimas
Section titled “Variables mínimas”Native
Section titled “Native”EXPO_PUBLIC_AUTH_ZAURUEXPO_PUBLIC_CLIENT_IDEXPO_PUBLIC_REDIRECT_URIEXPO_PUBLIC_WEB_BFF_BASE_URLEXPO_PUBLIC_WEB_BFF_DEV_BASE_URLopcional para dispositivo físico en dev
Valores operativos:
dev:EXPO_PUBLIC_AUTH_ZAURU=https://zauru-oauth-staging.herokuapp.comprod:EXPO_PUBLIC_AUTH_ZAURUdebe apuntar a la base OAuth productiva aprobada
Nota:
- aunque en staging el login visible pueda verse como
https://zauru-oauth-staging.herokuapp.com/login, en.envguardamos la base del proveedor porque native construye/dialog/authorizey/api/userinfodesdeEXPO_PUBLIC_AUTH_ZAURU.
Web (BFF)
Section titled “Web (BFF)”CLIENT_SECRETMOBILE_JWT_SECRETMOBILE_REFRESH_SECRETMOBILE_ALLOWED_REDIRECT_URISMOBILE_AUTH_REVOCATION_STORE_PATH
Nota:
EXPO_PUBLIC_AUTH_MODEya no es parte del contrato principal de setup. Si todavía existe localmente, se considera solo compatibilidad temporal.
Configuración recomendada dev/prod
Section titled “Configuración recomendada dev/prod”- Flujo oficial de dev mobile:
npm run devdesde la raíz- ese comando corre en modo manual BFF por defecto (
BOOST_AUTO_BFF=0)
- Flujo manual recomendado:
- levantar
apps/web - abrir
cloudflared tunnel --url http://localhost:3000 --no-autoupdate - fijar URL con
npm run dev:mobile:set-bff-url -- https://<url>.trycloudflare.com - correr
npm run dev:manual-bff
- levantar
- Flujo automático legacy opcional:
npm run dev:auto-bff
- Producción:
EXPO_PUBLIC_WEB_BFF_BASE_URL=https://crm.roo.com.gt
- Importante:
http://localhost:3000no funciona en iPhone físico para el BFFprodno usacloudflared, ni Expo tunnel, niEXPO_PUBLIC_WEB_BFF_DEV_BASE_URL
Prerrequisitos locales del flujo oficial
Section titled “Prerrequisitos locales del flujo oficial”cloudflaredinstalado- Xcode.app seleccionado, no CommandLineTools:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcrun simctl list devicesdebe funcionar
Dos túneles distintos en dev
Section titled “Dos túneles distintos en dev”- BFF tunnel
- normalmente lo abres manualmente con
cloudflared - expone
apps/web - actualiza
apps/native/.env.localconEXPO_PUBLIC_WEB_BFF_DEV_BASE_URL
- normalmente lo abres manualmente con
- Metro/dev-client tunnel
- lo abre Expo con
--tunnel - depende de Expo tunnel/ngrok
- lo abre Expo con
Regla:
- si falla
simctl, el problema es del entorno local/Xcode - si falla
ngrok/body, el problema es del tunnel de Expo, no del BFF
Fallback mínimo de emergencia
Section titled “Fallback mínimo de emergencia”npm run dev:lan --workspace=apps/native- solo usarlo cuando falle el modo manual-bff oficial
- no forma parte del happy path del proyecto
Guardrails
Section titled “Guardrails”- No exponer secretos en cliente.
- Persistencia de sesión en almacenamiento seguro.
- Rotación de refresh token en cada
refresh. client_kind = "mobile"debe viajar en exchange/login hacia BoostAPI.graphql_jwtde Zauru no debe persistirse en cliente.- El refresh normal sigue yendo por BFF.
- Mobile hereda contratos y metadata de backend; no inventa una capa paralela de auth o entidad.
Automatización recomendada para equipo
Section titled “Automatización recomendada para equipo”Flujo oficial actual (manual-bff)
Section titled “Flujo oficial actual (manual-bff)”Desde la raíz del monorepo:
npm run devLuego:
- levanta
apps/web(si no estaba arriba); - abre túnel HTTPS manual hacia
http://localhost:3000; - fija
apps/native/.env.localconnpm run dev:mobile:set-bff-url -- <url>; - deja
nativeen Metro LAN.
Nota: .env.local se usa porque la URL del túnel cambia con frecuencia y los scripts la sobrescriben en cada ejecución.
