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
| Atributo | Valor |
|---|---|
| Archivo | functions/api/zoho/admin-revoke.ts |
| Runtime | Cloudflare Pages Functions |
| Método HTTP | GET (intencional — facilita uso desde navegador) |
| Ruta | /api/zoho/admin-revoke |
Parámetros
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
member | string | ✅ | Uno de: Edu, Dani, Txell. Validado con isTeamMember(). |
Autorización
| Check | Mecanismo | Fallo |
|---|---|---|
| Actor es Edu | resolveTeamMember(request) === 'Edu' | 403 Forbidden |
?member válido | isTeamMember(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
| Import | Origen |
|---|---|
deleteToken | functions/api/_lib/zoho |
ZohoEnv | functions/api/_lib/zoho |
isTeamMember | functions/api/_lib/staff |
resolveTeamMember | functions/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
- Limpiar tokens erróneos post-onboarding (caso s68): tokens de Dani/Txell que apuntan a la cuenta de Edu.
- Forzar re-autorización de un miembro específico sin modificar la BD directamente.
- 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ódigo | Condición | Ejemplo |
|---|---|---|
403 | Actor 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]]