Saltar al contenido
VeloraBlog
← Todos los artículos

13 de junio de 2026

WSAA error ns1:coe.alreadyAuthenticated: "El CEE ya posee un TA válido" (ARCA/AFIP)

El fault ns1:coe.alreadyAuthenticated («El CEE ya posee un TA valido para el acceso al WSN solicitado») aparece cuando pedís un nuevo Ticket de Acceso a WSAA mientras todavía tenés uno válido. WSAA bloquea los pedidos duplicados dentro de una ventana preventiva. La solución no es reintentar: es cachear y reusar el TA, que dura unas 12 horas.

El fault que devuelve WSAA

SOAP Fault:
  faultcode:   ns1:coe.alreadyAuthenticated
  faultstring: El CEE ya posee un TA valido para el acceso al WSN solicitado

(TA = Ticket de Acceso; WSN = el web service que pediste, por ejemplo wsfe. Ojo: en el mensaje oficial la palabra va sin tilde, valido.) Es un SOAP Fault de WSAA: tu LoginTicketRequest fue rechazado porque ya hay un TA vigente para ese servicio. Según el cliente SOAP que uses, puede llegarte como excepción de fault y no necesariamente con HTTP 500.

Por qué pasa

WSAA emite un Ticket de Acceso (TA) válido por aproximadamente 12 horas. Si volvés a llamar a loginCms para el mismo servicio mientras ese TA sigue vigente, WSAA puede rechazar el pedido duplicado con ns1:coe.alreadyAuthenticated.

Además hay una ventana preventiva corta. Según el Manual del Desarrollador de WSAA, ese lapso preventivo es de 10 minutos en homologación (testing) y 2 minutos en producción — aunque el propio manual aclara que esos valores pueden modificarse dinámicamente y sin aviso previo. La causa de fondo es siempre la misma: estás pidiendo un TA nuevo en vez de reusar el que ya tenés.

El fix: cachear y reusar el TA

No reintentes ante este fault — esperar y volver a pedir un TA nuevo lo vuelve a disparar. El patrón correcto es guardar el TA y reusarlo hasta que expire:

// El TA trae token, sign y un <expirationTime>.
// Guardalo (archivo, DB, memoria) y reusalo hasta que venza.
if (ta && new Date(ta.expirationTime) > new Date()) {
  // TA vigente → reusá token + sign. NO llames loginCms.
} else {
  // Recién acá pedí uno nuevo con loginCms y guardá el TA.
}

Checklist:

  1. Al obtener el TA, guardá token, sign y expirationTime.
  2. Antes de cada request, chequeá expirationTime; si está vigente, reusá.
  3. Pedí un TA nuevo solo cuando el actual expiró.
  4. Si ya te pegó el fault, no reintentes en loop: reusá el TA vigente que ya tenés cacheado.