Habilita o inhabilita la protección de enumeración de correo electrónico

En esta guía, se explica la función de protección de enumeración de correo electrónico y se muestra cómo habilitarla o inhabilitarla. Si creaste tu proyecto el 15 de septiembre de 2023 o después de esa fecha, la protección de enumeración de correo electrónico estará habilitada de forma predeterminada.

Descripción general

La enumeración de correo electrónico es un tipo de ataque de fuerza bruta en el que un actor malicioso intenta adivinar o confirmar a los usuarios de un sistema pasando una dirección de correo electrónico a la API y verificando la respuesta.

Sin la protección de enumeración de correo electrónico, Identity Platform muestra información que se puede usar en un ataque de enumeración de correo electrónico:

  • Se intenta acceder con una dirección de correo electrónico que no existe en el sistema. Identity Platform muestra un error EMAIL_NOT_FOUND.

  • Se intentará registrarse con una dirección de correo electrónico que ya existe en el sistema. Identity Platform muestra un error EMAIL_EXISTS.

Puedes usar la función de protección de enumeración de correo electrónico de Identity Platform para proteger las cuentas de usuario de tu app contra estos ataques.

Cuando está habilitada la protección de enumeración de correo electrónico, el proyecto tiene el siguiente comportamiento:

  • La API de fetchSignInForEmail fallará. La vinculación de usuarios autenticados anónimos con una dirección de correo electrónico tampoco funcionará en versiones anteriores a SDK 22.3.0 para Android, 10.18.0 para iOS y 10.6.0 para Web.

  • Ya no se muestra una lista de métodos de acceso para una dirección de correo electrónico especificada cuando se llama a la API de REST de createAuthUri o al método del SDK de cliente fetchSignInMethodsForEmail en todas las plataformas.

  • Los usuarios no pueden cambiar su dirección de correo electrónico sin verificar primero la dirección nueva. Por ejemplo, ya no se puede cambiar la dirección de correo electrónico de un usuario con la API de REST update, la API de REST de setAccountInfo ni el método del SDK de cliente updateEmail en todas las plataformas.

    En su lugar, puedes usar verifyBeforeUpdateEmail para la Web y Android, o bien sendEmailVerification(beforeUpdatingEmail:) para iOS.

  • Ya no puedes usar la API de REST de setAccountInfo para vincular un proveedor de correo electrónico/contraseña con una cuenta de usuario existente. Ya no puedes usar el método del SDK cliente linkWithCredential con un EmailAuthCredential en ninguna plataforma. En su lugar, usa la API de REST signUp y pasa el token de ID del usuario en el campo idToken y los campos email y password que se vincularán.

  • Quita las respuestas de error para los flujos de verificación de correo electrónico, como las que se inician cuando se llama a la API de REST de sendOobCode con los tipos de solicitud VERIFY_AND_CHANGE_EMAIL o PASSWORD_RESET, y cuando se llama a verifyBeforeUpdateEmail para Web y Android, sendEmailVerification(beforeUpdatingEmail:) para iOS o sendPasswordResetEmail los métodos del SDK del cliente en todas las plataformas.

    Cuando haces una solicitud de restablecimiento de contraseña, se envía un mensaje de verificación solo si la dirección de correo electrónico existe; cuando haces una solicitud de cambio de dirección de correo electrónico, se envía un mensaje de verificación solo si la dirección de correo electrónico aún no existe. En ambos casos, no hay mensajes de error específicos que indiquen cuándo no se envían los correos electrónicos.

    Te recomendamos que no permitas que los usuarios se registren sin un flujo de verificación por correo electrónico.

  • Los casos de acceso no válidos muestran una respuesta de error INVALID_LOGIN_CREDENTIALS. Los casos de registro no válidos siguen mostrando errores EMAIL_EXISTS. Consulta las recomendaciones en la siguiente sección.

Si tu app depende de alguno de los comportamientos modificados por la protección de enumeración de correo electrónico, actualmente puedes inhabilitarla. Sin embargo, esto no se recomienda a largo plazo; consulta la siguiente sección.

Recomendaciones de seguridad

Uno de los métodos más comunes para realizar un ataque de apropiación de cuentas es realizar ataques de exceso de credenciales con credenciales filtradas o fáciles de adivinar. La enumeración de correos electrónicos también se puede usar para obtener información sensible sobre tus usuarios o para realizar ataques de suplantación de identidad (phishing) contra ellos. Por estos motivos, Google recomienda usar la función de protección de enumeración de correo electrónico para proteger tus apps contra esos ataques.

  • Si creaste tu proyecto el 15 de septiembre de 2023 o después de esa fecha, la protección de enumeración por correo electrónico está habilitada de forma predeterminada. Te recomendamos que dejes habilitada la protección de enumeración de correos electrónicos y no dependas de ninguno de los comportamientos mencionados anteriormente en esta guía.

  • Si creaste tu proyecto antes del 15 de septiembre de 2023, la protección de enumeración de correo electrónico no estará habilitada automáticamente.

    Si tus apps no dependen de ninguno de los comportamientos descritos anteriormente en esta guía, te recomendamos que habilites la protección de enumeración de correo electrónico de inmediato.

    Si tus apps dependen de alguno de los comportamientos descritos anteriormente, te recomendamos que comiences a migrar para dejar de hacerlo y que habilites la protección de enumeración de correo electrónico lo antes posible.

Además de usar la protección de enumeración de correo electrónico, considera tomar medidas para evitar el abuso de los extremos de registro de tu proyecto que continúan mostrando errores EMAIL_EXISTS. A continuación, te mostramos algunas formas de hacerlo:

  • Habilita la Verificación de aplicaciones.
  • Integra reCAPTCHA en tu flujo de registro.
  • No permitir el acceso con direcciones de correo electrónico y contraseñas o vínculos de correo electrónico. En su lugar, usa métodos alternativos, como Acceso con Google.

Habilitar la protección de enumeración de correo electrónico

Para habilitar la protección de enumeración de correo electrónico, sigue estos pasos:

Firebase console

  1. En Firebase console, ve a la página Configuración de Firebase Auth.

    Ir a la configuración de Firebase Auth

    1. En el panel de navegación, selecciona Acciones del usuario.

    2. Selecciona Protección de enumeración de correo electrónico (recomendada).

  2. Haz clic en Guardar.

Node.js

  1. Instala el SDK de Admin.

  2. Para habilitar la protección de enumeración de correo electrónico, usa una de las siguientes opciones:

    • Para la protección a nivel de proyecto, haz lo siguiente:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: true,
          },
        }
      );
      
    • Para obtener protección a nivel del usuario, haz lo siguiente:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().tenantConfigManager().updateTenant(TENANT_ID,
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: true,
          },
        }
      );
      

      Reemplaza TENANT_ID por el ID de usuario para el que deseas habilitar la protección de enumeración de correo electrónico.

REST

  1. En la consola de Google Cloud, imprime un token de acceso para el ID del proyecto con el comando gcloud auth print-access-token:

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Habilita la protección de enumeración de correo electrónico para tu ID del proyecto con la API de Identity Toolkit:

    curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':true}}" \
        -H 'Authorization: Bearer ACCESS_TOKEN' \
        -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \
        "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
    

Reemplaza lo siguiente:

  • ACCESS_TOKEN: El token de acceso que generaste antes
  • PROJECT_ID: el ID de tu proyecto

Inhabilitar la protección de enumeración de correo electrónico

Para inhabilitar la protección de enumeración de correo electrónico, sigue estos pasos:

Firebase console

  1. En Firebase console, ve a la página Configuración de Firebase Auth.

    Ir a la configuración de Firebase Auth

    1. En el panel de navegación, selecciona Acciones del usuario.

    2. Borra la Protección de enumeración de correo electrónico (recomendada).

  2. Haz clic en Guardar.

Node.js

  1. Instala el SDK de Admin.

  2. Para inhabilitar la protección de enumeración de correo electrónico, usa una de las siguientes opciones:

    • Para la protección a nivel de proyecto, haz lo siguiente:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().projectConfigManager().updateProjectConfig(
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: false,
          },
        }
      );
      
    • Para obtener protección a nivel del usuario, haz lo siguiente:

      import { getAuth } from 'firebase-admin/auth';
      
      getAuth().tenantConfigManager().updateTenant(TENANT_ID,
        {
          emailPrivacyConfig: {
            enableImprovedEmailPrivacy: false,
          },
        }
      );
      

      Reemplaza TENANT_ID por el ID de usuario para el que deseas inhabilitar la protección de enumeración de correo electrónico.

REST

  1. En la consola de Google Cloud, imprime un token de acceso para el ID del proyecto con el comando gcloud auth print-access-token:

    gcloud auth print-access-token --project=PROJECT_ID
    
  2. Inhabilita la protección de enumeración de correo electrónico con la API de Identity Toolkit:

    curl -X PATCH -d "{'emailPrivacyConfig':{'enableImprovedEmailPrivacy':false}}" \
        -H 'Authorization: Bearer ACCESS_TOKEN' \
        -H 'Content-Type: application/json' -H 'X-Goog-User-Project: PROJECT_ID' \
        "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=emailPrivacyConfig"
    

Reemplaza lo siguiente:

  • ACCESS_TOKEN: El token de acceso que generaste antes
  • PROJECT_ID: el ID de tu proyecto

Ejemplo de una respuesta de error

Si un usuario intenta acceder con una dirección de correo electrónico o una contraseña incorrectas, o con una dirección de correo electrónico que ya existe en el sistema, Identity Platform muestra un error similar al siguiente:

{
"code": "auth/internal-error",
"message": "{\"error\":{\"code\":400,\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"errors\":[{\"message\":\"INVALID_LOGIN_CREDENTIALS\",\"domain\":\"global\",\"reason\":\"invalid\"}]}}"
}