> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Obtenga más información sobre el Login Flow de Actions y el desencadenador post-login de Action, que se ejecuta después de que un usuario inicia sesión y cuando se solicita un Token de actualización.

# Desencadenador de Login

El desencadenador de Login se ejecuta cuando un usuario se autentica correctamente en una aplicación de un inquilino de Auth0. Esto también incluye la autenticación posterior al registro.

<Frame>
  <img src="https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2SkfIOm4fFOJ8N0GNJwam8/77230cdb4411b2383751b037fb56fe29/2024-09-30_10-01-42.png?fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=a87746af202921d48a23dfd31d096779" alt="Diagrama que muestra el Login Flow de Actions." width="1592" height="486" data-path="docs/images/cdy7uua7fh8z/2SkfIOm4fFOJ8N0GNJwam8/77230cdb4411b2383751b037fb56fe29/2024-09-30_10-01-42.png" />
</Frame>

Las Actions de este desencadenador son bloqueantes (sincrónicas), lo que significa que se ejecutan como parte del proceso del desencadenador e impiden que el resto del flujo de Auth0 continúe hasta que la Action se complete.

<div id="triggers">
  ## Activadores
</div>

<div id="login-post-login">
  ### Login / Post Login
</div>

El desencadenador `post-login` es una función que se ejecuta después de que un usuario inicia sesión y cuando se canjea un <Tooltip tip="Refresh Token: Token que se utiliza para obtener un nuevo Token de acceso sin obligar a los usuarios a volver a iniciar sesión." cta="Ver glosario" href="/es/docs/glossary?term=Refresh+Token">Token de actualización</Tooltip>.

<div id="references">
  #### Referencias
</div>

* [Objeto de evento](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object): Proporciona información contextual sobre un usuario que inicia sesión a través de Auth0.
* [Objeto API](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object): Proporciona métodos para cambiar el comportamiento del flujo.

<div id="common-use-cases">
  ## Casos de uso habituales
</div>

<div id="access-control">
  ### Control de acceso
</div>

Se puede usar una Action de post-login para implementar lógica personalizada que deniegue el acceso a un usuario que intenta acceder a una aplicación:

```javascript lines theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
 */
exports.onExecutePostLogin = async (event, api) => {
  if (event.user.email && event.user.email.endsWith("@example.com") && event.client.name === "My SPA") {
    api.access.deny(`Access to ${event.client.name} is not allowed.`);
  }
};
```

<div id="allow-access-only-on-weekdays-for-a-specific-application">
  ### Permita el acceso solo entre semana para una aplicación específica
</div>

Si tiene una aplicación y quiere asegurarse de que solo se pueda acceder a ella entre semana, puede crear la siguiente Action:

```javascript lines theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
 */
 exports.onExecutePostLogin = async (event, api) => {
  if (event.client.name === "APP_NAME") {
    const d = new Date().getDay();

    if (d === 0 || d === 6) {
      api.access.deny("This app is only available during the week.");
    }
  }
}
```

<div id="deny-access-to-anyone-calling-an-api">
  ### Denegar el acceso a quienes llamen a una API
</div>

Supongamos que quiere denegar el acceso a todos los usuarios que llaman a una API. Esto significa que debe denegar el acceso en función del valor de la <Tooltip tip="Audiencia: identificador único de la audiencia de un token emitido. Se denomina aud en un token y su valor contiene el ID de una aplicación (ID de cliente) para un ID Token o de una API (identificador de API) para un Token de acceso." cta="Ver glosario" href="/es/docs/glossary?term=audience">audiencia</Tooltip> de su API, que puede encontrar en el campo **API Audience** de su API en [Dashboard > Applications > APIs](https://manage.auth0.com/#/apis). Para ello, cree la siguiente Action:

```javascript lines theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
 */
 exports.onExecutePostLogin = async (event, api) => {
  // En Actions, una API se denomina Resource Server.
  if (event.resource_server && event.resource_server.identifier === "http://todoapi2.api") {
    api.access.deny("end_users_not_allowed");
  }
}
```

<div id="add-user-roles-to-id-and-access-tokens">
  ### Agregue roles del usuario a los tokens de ID y de acceso
</div>

Para agregar roles del usuario a los tokens emitidos por Auth0, use el objeto `event.authorization` junto con los métodos `api.idToken.setCustomClaim` y `api.accessToken.setCustomClaim`:

```javascript lines theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
 */
exports.onExecutePostLogin = async (event, api) => {
  const namespace = 'https://my-app.example.com';
  if (event.authorization) {
    api.idToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
    api.accessToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
  }
}
```

* Un claim personalizado no puede incluir ciertos términos, y recomendamos encarecidamente usar un claim con espacio de nombres en forma de URI. Consulta [nuestra documentación sobre claims personalizados](/es/docs/secure/tokens/json-web-tokens/create-custom-claims) para obtener más información.
* El <Tooltip tip="JSON Web Token (JWT): formato estándar de ID Token (y, a menudo, de Token de acceso) que se usa para representar claims de forma segura entre dos partes." cta="Ver glosario" href="/es/docs/glossary?term=JWT">JWT</Tooltip> que se devuelve a la aplicación solicitante se crea y firma al final del procesamiento del desencadenador. No se puede acceder al JWT final firmado desde una Action.

<div id="enrich-the-user-profile">
  ### Enriquecer el perfil de usuario
</div>

Auth0 proporciona un sistema para almacenar metadatos en un [perfil de usuario](/es/docs/manage-users/user-accounts/user-profiles/normalized-user-profiles). Para establecer `user_metadata` o `app_metadata` en el perfil de un usuario durante el inicio de sesión, use las funciones `api.user.setUserMetadata` o `api.user.setAppMetadata`.

```javascript lines theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del Login.
 */
exports.onExecutePostLogin = async (event, api) => {
  api.user.setUserMetadata("favorite_color", "blue");
};
```

Una vez ejecutadas todas las Actions de post-login, Actions actualizará el perfil de usuario en una sola operación. Esta operación está sujeta al [límite de tasa](/es/docs/troubleshoot/customer-support/operational-policies/rate-limit-policy/management-api-endpoint-rate-limits) de "Write Users".

<div id="enforce-custom-mfa-policy">
  ### Aplicar una política de MFA personalizada
</div>

Se puede usar una Action de post-login para exigir dinámicamente <Tooltip tip="Autenticación multifactor (MFA): proceso de autenticación de usuarios que utiliza un factor adicional además de username y contraseña, como un código por SMS." cta="Ver glosario" href="/es/docs/glossary?term=MFA">MFA</Tooltip> a un usuario según las necesidades de su aplicación.

```javascript lines theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del Login.
 */
exports.onExecutePostLogin = async (event, api) => {
  // Requerir MFA para cualquier usuario que inicie sesión desde América del Norte.
  if (event.request.geoip.continentCode === "NA") {
    api.multifactor.enable("any");
  };
};
```

Se debe configurar un proveedor de MFA para habilitar MFA al iniciar sesión. Para obtener más información, consulte [Autenticación multifactor](/es/docs/secure/multi-factor-authentication).

<div id="reduce-friction-with-passkeys">
  ### Reduce la fricción con claves de acceso
</div>

Una Action de post-login puede usarse para reducir la fricción al omitir dinámicamente MFA para un usuario que se haya autenticado con una clave de acceso.

```javascript lines theme={null}
/**
* Manejador que se llamará durante la ejecución de un flujo PostLogin.
*
* @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
* @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
*/
exports.onExecutePostLogin = async (event, api) => {
 // Verificar si se usó una clave de acceso para autenticar
 const skipMFA = event.authentication?.methods.some(
   (method) => method.name === "passkey"
 );

 // Si se usó una clave de acceso, omitir MFA
 if (skipMFA) {
   api.multifactor.enable("none");
 }
};
```

La conexión debe tener habilitadas las claves de acceso y MFA. Para obtener más información, consulte [Claves de acceso](/es/docs/authenticate/database-connections/passkeys) y [Autenticación multifactor](/es/docs/secure/multi-factor-authentication).

<div id="redirect-the-user-to-an-external-site">
  ### Redirigir al usuario a un sitio externo
</div>

Al igual que [Redirect Rules](/es/docs/customize/rules/redirect-users), puede usarse una Action de post-login para enviar al usuario a un sitio externo. Una vez completado el proceso, se puede redirigir al usuario de regreso a Auth0 para continuar su flujo de inicio de sesión. En el siguiente ejemplo, se usa una Redirect Action para pedirle al usuario que indique su color favorito.

```javascript lines expandable theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
 */
exports.onExecutePostLogin = async (event, api) => {
  // Omitir la redirección si el usuario ya eligió un color favorito.
  if (event.user.user_metadata.favorite_color) {
    return;
  }

  const token = api.redirect.encodeToken({
    secret: event.secrets.MY_SHARED_SECRET,
    payload: {
      email: event.user.email,
    },
  });

  // Enviar al usuario a https://my-app.example.com junto
  // con un parámetro de cadena de consulta `session_token`.
  api.redirect.sendUserTo("https://my-app.example.com", { 
    query: { session_token: token }
  });
};

/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
 */
exports.onContinuePostLogin = async (event, api) => {
  // Una vez que se llame al endpoint /continue, desempaquetar el token firmado
  // y almacenar el color favorito como metadatos del usuario.

  const payload = api.redirect.validateToken({
    secret: event.secrets.MY_SHARED_SECRET,
  });

  api.user.setUserMetadata("favorite_color", payload.favorite_color);
};
```

La canalización de Actions se suspenderá mientras se redirige al usuario. Una vez que el usuario continúe con su proceso de inicio de sesión en Auth0, la canalización de Actions se reanudará en el punto en que se suspendió. Las Actions que se ejecutaron antes de la redirección no se volverán a ejecutar.

Para obtener más información sobre las Actions de redirección, consulta [Redirección con Actions](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/redirect-with-actions).

<div id="modify-scopes-on-an-access-token">
  ### Modificar alcances en un token de acceso
</div>

Al modificar los alcances asociados con un <Tooltip tip="Token de acceso: credencial de autorización, en forma de una cadena opaca o un JWT, que se usa para acceder a una API." cta="Ver glosario" href="/es/docs/glossary?term=access+token">token de acceso</Tooltip>, asegúrese de seguir las prácticas recomendadas para especificar la audiencia.

* Compruebe siempre la audiencia esperada antes de agregar alcances.
* Evite usar entradas no confiables al agregar alcances.

```javascript lines theme={null}
/**
 * @param {Event} event - Detalles sobre el usuario y el contexto en el que está iniciando sesión.
 * @param {PostLoginAPI} api - Interfaz cuyos métodos pueden usarse para cambiar el comportamiento del login.
 */
exports.onExecutePostLogin = async (event, api) => {
  if (event?.resource_server?.identifier === 'https://example.com/api') {
    api.accessToken.addScope("read:xyz");
  }
};
```

<div id="deny-access-to-specific-ja3ja4-fingerprints">
  ### Deniegue el acceso a huellas JA3/JA4 específicas
</div>

El objeto `event.security_context` contiene los valores de las huellas JA3/JA4 de la transacción actual.

```js lines theme={null}
exports.onExecutePreUserRegistration = async (event, api) => {
  const clientJa4 = event?.security_context?.ja4;
  console.log('[ACTION]', {clientJa4});
  const badFingerprints = ['t13d1517h2_8daaf6152771_b6f405a00624','t13d1516h2_8daaf6152771_d8a2da3f94cd'];
  if (clientJa4 && badFingerprints.includes(clientJa4)){
    api.access.deny('suspicious_tls_fingerprint', 'Your TLS fingerprint has been flagged as suspicious');
  }
};
```

<div id="learn-more">
  ## Más información
</div>

* [Gestionar los metadatos del usuario con el desencadenador post-login de Action](/es/docs/manage-users/user-accounts/metadata/manage-user-metadata)
* [Redirigir con Actions](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/redirect-with-actions)
* [Comprender cómo funcionan los metadatos en los perfiles de usuario](/es/docs/manage-users/user-accounts/metadata)
