CreaRack-SL

Endpoint admin-revoke — Borrado de token Zoho de cualquier miembro (solo Edu)

Descripción

GET /api/zoho/admin-revoke?member=Edu|Dani|Txell

Handler CF Pages Function que permite a Edu (único actor autorizado) eliminar el token Zoho almacenado de cualquier miembro del staff. Se invoca directamente desde el navegador pegando la URL con una sesión CF Access activa, sin necesidad de curl ni formularios.

El endpoint es reversible: el token borrado se puede reestablecer re-autorizando con /api/oauth/zoho/start?as=<member> (cerrando sesión en mail.zoho.eu previamente).


Motivación — caso s68

Durante el onboarding inicial, las tres autorizaciones OAuth de Zoho (una por cada miembro del staff) se realizaron consecutivamente sin cerrar la sesión Zoho entre cada ?as=X. El resultado fue que los tres tokens almacenados pertenecían a la misma cuenta Zoho de Edu. Este endpoint permite a Edu limpiar esas filas incorrectas sin acceder directamente a la base de datos.


Localización

AtributoValor
Archivofunctions/api/zoho/admin-revoke.ts
RuntimeCloudflare Pages Functions
Método HTTPGET (intencional — facilita uso desde navegador)
Ruta/api/zoho/admin-revoke

Parámetros

ParámetroTipoObligatorioDescripción
memberstring✅Uno de: Edu, Dani, Txell. Validado con isTeamMember().

Autorización

CheckMecanismoFallo
Actor es EduresolveTeamMember(request) === 'Edu'403 Forbidden
?member válidoisTeamMember(memberParam)400 Bad Request

Solo el miembro resuelto como 'Edu' puede invocar este endpoint. Cualquier otro actor recibe 403 con el campo actor en el cuerpo para diagnóstico.


Flujo interno

request
  │
  ├─ resolveTeamMember(request)
  │    └─ actor !== 'Edu'  →  403
  │
  ├─ url.searchParams.get('member')
  │    └─ !memberParam || !isTeamMember(memberParam)  →  400
  │
  └─ deleteToken(env, memberParam)  →  200 { revoked: true, team_member, note }

La nota de respuesta incluye el comando de re-autorización: /api/oauth/zoho/start?as=<member>.


Dependencias internas

ImportOrigen
deleteTokenfunctions/api/_lib/zoho
ZohoEnvfunctions/api/_lib/zoho
isTeamMemberfunctions/api/_lib/staff
resolveTeamMemberfunctions/api/_lib/staff

Decisión de diseño: GET en lugar de POST/DELETE

El uso de GET es deliberado. Permite pegar la URL directamente en el navegador cuando se tiene una sesión CF Access activa, evitando herramientas externas. La acción es reversible (re-autorización restaura el token), por lo que el riesgo de idempotencia HTTP relajada es aceptable para este contexto de utility admin.


Casos de uso

  1. Limpiar tokens erróneos post-onboarding (caso s68): tokens de Dani/Txell que apuntan a la cuenta de Edu.
  2. Forzar re-autorización de un miembro específico sin modificar la BD directamente.
  3. Diagnóstico de integración Zoho cuando un miembro reporta errores de calendario/tareas.

Respuesta de éxito

{
  "revoked": true,
  "team_member": "Dani",
  "note": "Token de Dani eliminado. Re-autoriza con /api/oauth/zoho/start?as=Dani (recuerda cerrar sesión en mail.zoho.eu antes)."
}

Respuestas de error

CódigoCondiciónEjemplo
403Actor no es Edu{ "error": "Solo Edu puede usar admin-revoke.", "actor": "Dani" }
400?member ausente o inválido{ "error": "?member requerido y debe ser uno de: Edu, Dani, Txell. Got: null" }

Véase también

  • [[entity—zoho—lib—zoho]]
  • [[entity—zoho—lib—staff]]
  • [[feature—zoho—oauth-onboarding]]
  • [[concept—infra—cloudflare-pages-functions]]
  • [[concept—zoho—staff-token-management]]