Volver a la wiki

resolveActorEmail — resolución de identidad CF Access con fallback JWT

resolveActorEmail — Resolución de identidad CF Access con fallback JWT

Función exportada en functions/_lib/staff.ts que devuelve el email del actor autenticado en un request de Cloudflare Pages Functions. Es el único punto de resolución de identidad para las integraciones que necesitan saber “quién es este request”.

Problema que resuelve

CF Access puede inyectar la identidad del usuario de dos formas distintas:

  1. Header Cf-Access-Authenticated-User-Email: solo está disponible si la aplicación CF Access tiene activada la opción “Include identity”. En CreaRack Pro esta opción no estaba activada, por lo que el panel /settings/integrations/zoho mostraba “sesión actual: desconocida” y bloqueaba la re-autorización.

  2. JWT en Cf-Access-Jwt-Assertion: CF Access siempre inyecta este header en requests autenticados. El payload del JWT incluye el claim email cuando la política tiene identidad de usuario.

Comportamiento

resolveActorEmail(request)
  ├── Lee header cf-access-authenticated-user-email
  │     Si existe → devuelve email.toLowerCase()
  └── Fallback: lee cf-access-jwt-assertion
        Si existe → decodeJwtPayload() → payload.email.toLowerCase()
        Si no → null

Seguridad del decode sin validar firma

La función auxiliar decodeJwtPayload decodifica el payload Base64url sin verificar la firma. Esto es seguro en este contexto porque:

Firma

export function resolveActorEmail(request: Request): string | null
RetornoCondición
string (email en minúsculas)Header presente O JWT con claim email válido
nullSin header y sin JWT, o JWT malformado

Función auxiliar

function decodeJwtPayload(jwt: string): Record<string, unknown> | null

Privada (no exportada). Realiza:

  1. Split del JWT en 3 partes.
  2. Conversión Base64url → Base64 estándar (sustitución -→+, _→/).
  3. Padding con === según longitud.
  4. atob() + JSON.parse().
  5. Devuelve null en cualquier error.

Consumidores

Función/MóduloUso
resolveTeamMember(request)Usa resolveActorEmail internamente para mapear email → TeamMember
oauth/zoho/start.tsLlama directamente para obtener cfAccessEmail (auditoría + modo admin)

Ubicación

functions/_lib/staff.ts

El módulo _lib/staff.ts es el único mapping canónico CF Access email → TeamMember del proyecto. Todas las integraciones que necesiten identificar al actor deben pasar por este módulo, no leer el header directamente.

Historial

Introducida en commit e65dde4 (fix #46, 2026-05-17) como parte del fix del panel Zoho que mostraba “sesión actual: desconocida”.

Véase también

Subir