> ## 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.

> Aprenda a migrar su código actual de Hooks de Auth0 a código de Actions de Auth0.

# Migrar de Hooks a Actions

Al convertir Hooks existentes en Actions, debe asociar la nueva Action con el Trigger correspondiente al tipo de Hook. Si sigue los pasos a continuación y usa las correspondencias que identificamos en ellos, la funcionalidad debería ser idéntica.

<div id="plan-your-migration">
  ## Planifica tu migración
</div>

Las Actions desplegadas se ejecutan después de los Hooks activos, por lo que puedes convertir los Hooks uno a uno en el Dashboard o todos de una vez mediante la <Tooltip tip="Management API: Un producto que permite a los clientes realizar tareas administrativas." cta="Ver glosario" href="/es/docs/glossary?term=Management+API">Management API</Tooltip>.

Tendrás que convertir el código y, después, activar la Action y desactivar el Hook. Activar la Action y desactivar el Hook puede hacerse rápidamente en sucesión, pero, según el orden, podría haber un breve período de tiempo en el que se ejecuten ambos o ninguno.

Por eso, te recomendamos migrar tu pipeline paso a paso: convierte partes del código de tus Hooks en código de Action, pruébalas en un entorno de ensayo y luego pásalas a producción una a una. Como los Hooks activos se ejecutan antes que las Actions desplegadas, puedes mantener parte de la lógica en Hooks mientras desarrollas y pruebas otra lógica en Actions.

<Card title="Consejos para planificar tu migración">
  * Usa indicadores para evitar duplicar operaciones costosas o que solo deben ejecutarse una vez.
  * Asegúrate de aplicar los cambios en un momento en que el impacto y el tráfico sean mínimos.
  * Considera usar [Auth0 Deploy CLI](/es/docs/deploy-monitor/deploy-cli-tool) para crear scripts, probar e implementar rápidamente la migración de una sola vez o de forma iterativa.
</Card>

<div id="understand-limitations">
  ## Comprenda las limitaciones
</div>

Aunque Actions puede gestionar la gran mayoría de las tareas que Hooks puede realizar, debe tener en cuenta algunas limitaciones antes de iniciar la migración. (Recuerde: puede tener tanto Hooks como Actions en ejecución mientras migra).

* Actions no puede conservar datos, como <Tooltip tip="Token de acceso: credencial de autorización, en forma de cadena opaca o JWT, que se usa para acceder a una API." cta="Ver glosario" href="/es/docs/glossary?term=access+tokens">tokens de acceso</Tooltip> o respuestas de API, entre ejecuciones.
* Actions no dispone de [un token de acceso para la Management API](/es/docs/customize/rules/use-management-api) ni de [acceso al objeto global `auth0`](/es/docs/customize/actions/action-coding-guidelines#global-object), como sí ocurre en Hooks.

Para ver la lista completa de limitaciones, consulte [Limitaciones de Actions](/es/docs/customize/actions/limitations).

<div id="convert-code">
  ## Convertir código
</div>

Para convertir un Hook en una Action, debes sustituir el código específico de Hooks por código de Actions. En esta sección se describen las tareas que deberás realizar para convertir un Hook funcional en su Action equivalente.

<Card title="Consejos para convertir código">
  * En general, busca en el objeto `event` de Actions las propiedades de solo lectura de los objetos que se pasan a la función de Hooks.
  * Usa el editor de código de Actions en el Auth0 Dashboard para escribir tu código; te ayudará resaltando errores y ofreciendo sugerencias de autocompletado.
  * Antes de pasar a producción, [prueba exhaustivamente tus nuevas Actions](/es/docs/customize/actions/test-actions) en un [entorno de preproducción o de prueba](/es/docs/get-started/auth0-overview/create-tenants/set-up-multiple-environments).
</Card>

<div id="copy-hook-code-to-a-new-action">
  ### Copie el código del Hook en una nueva Action
</div>

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Le recomendamos copiar el código de su Hook en una nueva Action y usar el editor de código de Actions en Auth0 Dashboard; esto le ayudará a identificar los problemas pendientes en su código.
</Callout>

1. Inicie sesión en su inquilino de producción y copie el código del Hook que desea convertir.
2. Cambie a un inquilino que no sea de producción y vaya a [Auth0 Dashboard > Actions > Library](https://manage.auth0.com/#/select-tenant?path=/actions/library).
3. Seleccione **Build Custom** y, a continuación:

   * Introduzca un **nombre** para su Action que coincida con el nombre del Hook que está convirtiendo.

   * Busque **Trigger** y seleccione el trigger adecuado\*\*:\*\*

     | Tipo de Hook                | Trigger de Actions     |
     | --------------------------- | ---------------------- |
     | Client Credentials Exchange | M2M/Client-Credentials |
     | Pre-User-Registration       | Pre User Registration  |
     | Post-User-Registration      | Post User Registration |
     | Post-Change-Password        | Post Change Password   |
     | Send Phone Message          | Send Phone Message     |

   * Busque **Runtime** y seleccione **Node 18.**

   * Seleccione **Create**.
4. En el bloque de código del editor de código de Actions, pegue el código del Hook que desea convertir debajo de la función exportada.
5. Realice los cambios detallados en el resto de este artículo a medida que mueve el código a la función.
   También debería leer sobre el objeto `event` asociado al nuevo trigger de Actions; verá enlaces a la documentación pertinente cuando llegue más adelante, en esta guía, a la sección [Cambiar cómo se accede a los datos](#change-how-data-is-accessed).

<div id="change-the-function-declaration">
  ### Cambie la declaración de la función
</div>

Las funciones de Hooks se exportan mediante una exportación por defecto, mientras que las funciones de Actions usan exportaciones con nombre. Según el tipo de Hook que vaya a convertir, la exportación con nombre será diferente. Las correspondencias son:

| Tipo de Hook                | Exportación con nombre          |
| --------------------------- | ------------------------------- |
| Client Credentials Exchange | `onExecuteCredentialsExchange`  |
| Pre-registro de usuario     | `onExecutePreUserRegistration`  |
| Posregistro de usuario      | `onExecutePostUserRegistration` |
| Post-Change Password        | `onExecutePostChangePassword`   |
| Send Phone Message          | `onExecuteSendPhoneMessage`     |

**Antes**

```javascript lines theme={null}
module.exports = async function myHooksFunction(){}
```

**Después**

```javascript lines theme={null}
// Client Credentials Exchange
exports.onExecuteCredentialsExchange = async (event, api) => {}

// Registro previo de usuario
exports.onExecutePreUserRegistration = async (event, api) => {}

// Registro posterior de usuario
exports.onExecutePostUserRegistration = async (event) => {}

// Post-Change Password
exports.onExecutePostChangePassword = async (event) => {}

// Send Phone Message
exports.onExecuteSendPhoneMessage = async (event) => {}
```

<div id="convert-dependencies">
  ### Convertir dependencias
</div>

Hooks y Actions gestionan las dependencias de forma similar. En ambos casos, las dependencias se agregan por separado mediante la UI o la Management API y se incluyen en el código. Además, en ambos casos, puede usar cualquier paquete disponible en el registro de `npm`.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Si sus módulos de `npm` no están en la versión más reciente, ¡este es un buen momento para actualizarlos!
</Callout>

1. Busque sentencias `require` en el código de su Hook.
2. Elimine los números de versión, pero anótelos.
3. Agregue la dependencia siguiendo los pasos de la sección "Add a Dependency" de [Write Your First Action](/es/docs/customize/actions/write-your-first-action) (si la dependencia no es un [módulo principal de NodeJS](https://github.com/nodejs/node/tree/master/lib); si la dependencia es un módulo principal de NodeJS, no necesita incluirla).
4. Mueva las sentencias `require` encontradas fuera de la declaración `function`.

<div id="convert-secrets">
  ### Convertir secretos
</div>

Hooks y Actions manejan los secretos de forma similar. En ambos casos, los secretos se agregan para cada Hook/Action mediante la interfaz de usuario o la Management API y se incluyen en el código.

Para convertir secretos de Hooks a Actions:

1. Guarda los valores necesarios para la Action específica en la que estás trabajando.
2. Agrega un secreto para cada valor al que necesites acceder desde la Action. Para saber cómo hacerlo, consulta la sección **Add a Secret** en [Write Your First Action](/es/docs/customize/actions/write-your-first-action).
3. Convierte tu código:

**Antes**

```javascript lines theme={null}
async function (user, context, cb) {
    const { SECRET_NAME } = context.webtask.secrets;

    // ... código adicional
}
```

**Después**

```javascript lines theme={null}
async (event, api) => {
    const { SECRET_NAME } = event.secrets;

	// ... código adicional
};
```

Al igual que con Hooks, Auth0 cifra en reposo todos los valores secretos.

<div id="change-how-data-is-accessed">
  ### Cambiar cómo se accede a los datos
</div>

Con Hooks, los datos sobre el usuario, el cliente, la solicitud y otros datos contextuales se almacenan en varios argumentos que se pasan a la función Hook. En Actions, estos datos se han reorganizado y movido al objeto `event`. Muchas de las propiedades se trasladaron sin cambios, pero algunas se han combinado para mayor claridad.

Según el tipo de Hook que esté convirtiendo, el objeto `event` variará:

* [Intercambio de credenciales de cliente: objeto de evento de Actions](/es/docs/customize/actions/explore-triggers/machine-to-machine-trigger/credentials-exchange-event-object)
* [Post-Change Password: objeto de evento de Actions](/es/docs/customize/actions/explore-triggers/password-reset-triggers/post-change-password-trigger/post-change-password-event-object)
* [Después del registro de usuario: objeto de evento de Actions](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/post-user-registration-trigger/post-user-registration-event-object)
* [Antes del registro de usuario: objeto de evento de Actions](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/pre-user-registration-trigger/pre-user-registration-event-object)
* [Send Phone Message: objeto de evento de Actions](/es/docs/customize/actions/explore-triggers/mfa-notifications-trigger/send-phone-message-event-object)

**Antes**

```javascript lines theme={null}
async function (user, context, cb) {
	const clientId = context.clientID;
	const tenant = context.connection.tenant

	// ... código adicional
}
```

**Después**

```javascript lines theme={null}
async (event, api) => {
	const clientId = event.client.client_id;
	const tenant = event.tenant.id;

	// ... código adicional
};
```

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  A diferencia del objeto `context` de Hooks, los datos almacenados o modificados en las propiedades del objeto `event` no se conservan en las Actions posteriores. Si tu Hook establece datos en estas propiedades para activar funcionalidades principales, tendrás que usar la interfaz `api` disponible en los flujos de Actions [Machine to Machine](/es/docs/customize/actions/explore-triggers/machine-to-machine-trigger/credentials-exchange-api-object) y [Pre User Registration](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/pre-user-registration-trigger/pre-user-registration-api-object) para conservar los datos entre Actions.
</Callout>

<div id="convert-callbacks">
  ### Convertir las callbacks
</div>

Cuando un Hook termina de procesarse, debe llamar a la función `callback()` para completar su ejecución. En cambio, Actions no usa un mecanismo de callback; por lo tanto, deberá eliminar todas las instancias de `callback()` de su función de Actions.

Si antes usaba la función `callback()` en un Hook de Client Credentials Exchange o Pre User Registration para hacer que falle la solicitud o actualizar un usuario, podrá seguir haciéndolo en Actions mediante una nueva interfaz `api`.

<div id="client-credentials-exchange">
  #### Client Credentials Exchange
</div>

Si agregabas claims adicionales al token de acceso en un Hook de Client Credentials Exchange:

```javascript lines theme={null}
// Client Credentials Exchange Hook
module.exports = function(client, scope, audience, context, cb) {
  var access_token = {};
  access_token.scope = scope;

  access_token['https://example.com/claim'] = 'bar';
  cb(null, access_token);
};
```

Ahora puede usar el [objeto de la API de Client Credentials Exchange](/es/docs/customize/actions/explore-triggers/machine-to-machine-trigger/credentials-exchange-api-object) de Actions:

```javascript lines theme={null}
// Action de intercambio de credenciales de cliente
exports.onExecuteCredentialsExchange = async (event, api) => {
  api.accessToken.setCustomClaim("https://example.com/claim", 'bar');  
};
```

<div id="pre-user-registration">
  #### Pre User Registration
</div>

Si estaba agregando claims adicionales al token de acceso en un Hook de Pre User Registration:

```javascript lines theme={null}
// Hook de Pre User Registration
module.exports = function (user, context, cb) {
	if (user.app_metadata.condition === "success") {
      var response = {};
      response.user = { user_metadata: { favorite_color: "purple" } };
      // Este Hook se ejecutó correctamente; continuar con el siguiente Hook.
	  return callback(null, response);
	}

	if (user.app_metadata.condition === "failure") {
		// Este Hook falló; detener el inicio de sesión con una respuesta de error.
		return callback(new Error("Failure message"));
	}

	// ... código adicional
};
```

Ahora puede usar el [objeto de la API Pre User Registration](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/pre-user-registration-trigger/pre-user-registration-api-object):

```javascript lines theme={null}
// Action de Pre User Registration
exports.onExecutePreUserRegistration = async (event, api) => {
	if (event.user.app_metadata.condition === "success") {
		// Esta Action se ejecutó correctamente; continúa con la siguiente Action.
		api.user.setUserMetadata("favorite_color", "purple");
		return;
	}

	if (event.user.app_metadata.condition === "failure") {
		// Esta Action falló; detén la llamada con una respuesta de error.
		return api.access.deny("Failure message");
	}

	// ... código adicional
};
```

<div id="complete-the-migration">
  ## Completa la migración
</div>

Una vez que hayas escrito y probado el nuevo código de Actions, debes activar la Action y desactivar el Hook. Estas dos tareas pueden realizarse rápidamente una tras otra, pero, según el orden, podría haber un breve período en el que se ejecuten ambas o ninguna. Como los Hooks activos se ejecutan antes que las Actions implementadas, puedes mantener parte de la lógica en Rules mientras desarrollas y pruebas otra lógica en Actions.
