Troubleshooting reCAPTCHA en login
Este checklist ayuda a diagnosticar casos donde el login falla con reCAPTCHA verification failed, especialmente cuando en modo incógnito sí funciona.
1) Validación rápida con usuario afectado
- Probar en ventana normal y confirmar si en incógnito funciona.
- Desactivar extensiones de privacidad/bloqueadores para
abaco.hnyapi.abaco.hn. - Borrar datos del sitio para:
abaco.hnapi.abaco.hngoogle.comgstatic.com
- Verificar fecha/hora del dispositivo.
- Probar otra red (hotspot móvil) para descartar bloqueo por IP/red.
2) Revisión en Google reCAPTCHA (consola)
En la consola de Google reCAPTCHA revisar:
- El
site keypertenece al ambiente correcto (producción). - El
secret keydel backend corresponde al mismosite key. - Los dominios permitidos incluyen
abaco.hn(y los subdominios necesarios). - No hubo rotación parcial de claves (frontend actualizado y backend no, o viceversa).
3) Variables de entorno a confirmar
- Frontend build:
NEXT_PUBLIC_RECAPTCHA_SITE_KEY
- Backend:
RECAPTCHA_SECRET_KEYRECAPTCHA_DISABLED(debe estar desactivado en producción)RECAPTCHA_MIN_SCORE(umbral de score; por defecto0.3, usado para registrar/monitorear)RECAPTCHA_ENFORCE_SCORE(por defecto no bloquea por score bajo; solo se registra. Activar atruesolo si se quiere bloquear logins con score por debajo del umbral)RECAPTCHA_FAIL_OPEN(por defecto true: si el backend no puede contactar a Google, permite el login para no bloquear a todos. Ponerfalsepara fail-closed)
Nota: desde el ajuste para reducir falsos bloqueos, un score bajo ya no bloquea el login por defecto; se registra como
[reCAPTCHA] low score allowedpara monitoreo. Los logins se siguen rechazando cuando Google declina el token (google-declined), hay desajuste de acción (action-mismatch) o falta el token (missing-token).Mitigaciones adicionales aplicadas:
- Fail-open ante caída de red backend→Google (
siteverify-request-failed): por defecto se permite el login (configurable conRECAPTCHA_FAIL_OPEN); se registra[reCAPTCHA] siteverify request failed.reasonen la respuesta: el endpoint devuelve{ code: 'RECAPTCHA_FAILED', reason }para diagnóstico.- Reintento automático en el frontend: ante un fallo temporal (
google-declined,siteverify-request-failed,missing-token) el formulario reintenta una vez con un token nuevo.
4) Señales en logs y causa probable
Con la instrumentación actual, revisar logs del backend para el evento [reCAPTCHA] verification failed:
errorCodes:invalid-input-response: token inválido o malformado.timeout-or-duplicate: token expirado o reutilizado.bad-request: request inválido al endpoint de Google.
action-mismatch: el token no corresponde a la acción esperada (login/register).score-too-low: score inferior al umbral definido enRECAPTCHA_MIN_SCORE.siteverify-request-failed: problema de red/timeout hacia Google desde el backend.
5) Mitigaciones recomendadas
- Mantener bloqueado el submit cuando no se genere token en frontend.
- Reintentar token cuando el error sea temporal de red.
- Exponer un mensaje de soporte con pasos de navegador/red para el usuario final.
- Monitorear tasa de
RECAPTCHA_FAILEDpor navegador/IP para detectar bloqueos masivos.