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

> Describe cómo pasar metadatos de usuario o de la aplicación entre las Actions de inicio de sesión y de post-login.

# Metadatos de transacción de Actions

Los metadatos de transacción de Actions permiten almacenar, acceder y/o compartir metadatos personalizados dentro de una Action de [post-login](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger) durante una transacción.

Anteriormente, cada Action funcionaba de forma independiente, lo que dificultaba pasar información entre ellas. Con los metadatos de transacción de Actions, ahora es posible:

* Compartir datos entre Actions, como respuestas de API o cálculos intermedios.
* Evitar tener que volver a obtener o recalcular la misma información en distintas Actions.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Antes de usar metadatos de transacción durante el desarrollo, te recomendamos revisar las limitaciones. Para obtener más información, consulta [Limitaciones de Actions](/es/docs/customize/actions/limitations).
</Callout>

<div id="how-it-works">
  ## Cómo funciona
</div>

Use el [objeto API de post-login](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object) `api.transaction.setMetadata` para establecer el par clave-valor y almacenar metadatos de la transacción.

Use el [objeto Event de post-login](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object) `event.transaction.metadata` para acceder al par clave-valor almacenado en la misma Action o en Actions posteriores del trigger de post-login durante una sola ejecución.

Los objetos API y Event aceptan los siguientes parámetros:

| Valor   | Tipo                          | Descripción                                                                                     |
| ------- | ----------------------------- | ----------------------------------------------------------------------------------------------- |
| `Key`   | `String`                      | La clave de la propiedad de metadatos que se va a establecer.                                   |
| `Value` | `String`, `Number`, `Boolean` | El valor de la propiedad de metadatos.<br />Si se establece en `null`, la propiedad se elimina. |

Para obtener más información sobre cómo escribir Actions, lea [Escriba su primera Action](/es/docs/customize/actions/write-your-first-action).

<div id="latency">
  ## Latencia
</div>

El uso de metadatos de transacción de Actions podría añadir una latencia mínima. Esa latencia sería proporcional al tamaño de la carga útil de los metadatos y sería relevante cuando se produzcan suspensiones de Actions. Por ejemplo, activar <Tooltip tip="" cta="Ver glosario" href="/es/docs/glossary?term=MFA">MFA</Tooltip>, redirigir desde Actions o renderizar Forms podría causar problemas de latencia debido a la necesidad de volver a cargar datos desde el almacenamiento.

Aun así, la latencia potencial debería ser menor que la de las solicitudes HTTP salientes redundantes necesarias para recuperar los datos que requiere la secuencia de Actions.

<div id="examples">
  ## Ejemplos
</div>

<div id="access-metadata-immediately">
  ### Accede a los metadatos de inmediato
</div>

Establece pares clave-valor en los metadatos de la transacción y accede a los valores de inmediato.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('hello', 'Auth0');

  console.log('Hello ', event.transaction?.metadata?.hello);
  /* Muestra "Hello Auth0" */
};
```

<div id="set-supported-values">
  ### Establecer valores admitidos
</div>

Establezca valores de tipo `string`, `number` y `boolean`.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('string_value', 'Auth0');
  api.transaction.setMetadata('boolean_value', true);
  api.transaction.setMetadata('number_value', 12);

  console.log('string_value', event.transaction?.metadata?.string_value);
  /* Muestra "string_value Auth0" */
  console.log('boolean_value', event.transaction?.metadata?.boolean_value);
  /* Muestra "boolean_value true" */
  console.log('number_value', event.transaction?.metadata?.number_value);
  /* Muestra "number_value 12" */
};
```

<div id="serialize-values">
  ### Serializar valores
</div>

Serialice los valores como `strings` dentro de los [límites](/es/docs/customize/actions/limitations#transaction-metadata).

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  No puede establecer valores de tipo `object` ni `array`, pero puede serializarlos como `strings`.
</Callout>

```text lines expandable theme={null}
exports.onExecutePostLogin = async (event, api) => {
  const serialized_object_value = JSON.stringify({
    string_value: 'Auth0',
    boolean_value: true,
    number_value: 12
  });

  api.transaction.setMetadata('serialized_object_value', serialized_object_value);

  const serialized_array_value = JSON.stringify([
    'Auth0',
    true,
    12
  ]);
  api.transaction.setMetadata('serialized_array_value', serialized_array_value);

  console.log('serialized_object_value',
    JSON.parse(event.transaction?.metadata?.serialized_object_value)
  );
  /* Muestra "serialized_object_value { string_value: 'Auth0', boolean_value: true, number_value: 12 }" */

  console.log('serialized_array_value',
    JSON.parse(event.transaction?.metadata?.serialized_array_value)
  );
  /* Muestra "serialized_array_value [ 'Auth0', true, 12 ]" */
};
```

<div id="share-values-between-actions">
  ### Compartir valores entre Actions
</div>

Comparta pares clave-valor entre Actions en la misma secuencia de ejecución.

**Action 1**

Establezca la clave `hello` con el valor `Auth0` mediante el método `setMetadata` del objeto `api`.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('hello', 'Auth0');
};
```

**Action 2**

Registra el valor de `Auth0` para la clave `hello` en los metadatos de la transacción y usa la propiedad `transaction.metadata` del objeto `event` para acceder a los valores establecidos.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  console.log('Hello', event.transaction?.metadata?.hello);
  /* Muestra "Hello Auth0" */
};
```

<div id="update-metadata">
  ### Actualizar metadatos
</div>

Asigne un valor distinto a una clave existente para actualizar los metadatos.

**Action 1**

Establezca el par clave-valor de metadatos de la transacción en `custom_tx_id` y `xyz123`.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('custom_tx_id', 'xyz123');
};
```

**Action 2**

Registre la clave como `custom_tx_id` y el valor como `xyz123`. Luego, establezca `custom_tx_id` en `abc456` para volver a registrarlo con el valor más reciente de `custom_tx_id` en los metadatos de la transacción.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  console.log('custom_tx_id', event.transaction?.metadata?.custom_tx_id);
  /* Muestra "custom_tx_id xyz123" */

  api.transaction.setMetadata('custom_tx_id', 'abc456');

  console.log('custom_tx_id', event.transaction?.metadata?.custom_tx_id);
  /* Muestra "custom_tx_id abc456" */
};
```

**Action 3**

Registre el valor `abc456` en `custom_tx_id`.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  console.log('custom_tx_id', event.transaction?.metadata?.custom_tx_id);
  /* Muestra "custom_tx_id abc456" */
};
```

<div id="remove-metadata">
  ### Eliminar metadatos
</div>

Elimine los valores de los metadatos de la transacción asignando `null` al valor de cada clave concreta.

**Action 1**

Establezca `custom_tx_id` en los metadatos de la transacción.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('custom_tx_id', 'xyz123');
};
```

**Action 2**

Establece `custom_tx_id` en `null` y registra ese valor `null` para `custom_tx_id`.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  console.log('custom_tx_id', event.transaction?.metadata?.custom_tx_id);
  /* Muestra "custom_tx_id xyz123" */

  api.transaction.setMetadata('custom_tx_id', null);

  console.log('custom_tx_id', event.transaction?.metadata?.custom_tx_id);
  /* Muestra "custom_tx_id undefined" */
};
```

**Action 3**

Registra el valor `null` de `custom_tx_id`.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  console.log('custom_tx_id', event.transaction?.metadata?.custom_tx_id);
  /* Muestra "custom_tx_id undefined" */
};
```

<div id="preserve-values-on-redirect-to-external-sites">
  ### Conservar valores al redirigir a sitios externos
</div>

Conserve los metadatos de la transacción durante las [redirecciones](/es/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/redirect-with-actions). Los valores estarán disponibles cuando los usuarios continúen el flujo de autenticación.

**Action 1**

Establece un `custom_tx_id` en los metadatos de la transacción.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('custom_tx_id', 'xyz123');
};
```

**Action 2**

Redirige a un sitio externo y envía un token con el `custom_tx_id` de los metadatos de la transacción. Luego compara el valor de `custom_tx_id` en los metadatos de la transacción con el que se envió al sitio externo y que se devolvió en la carga útil de otro token.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  const token = api.redirect.encodeToken({
    secret: event.secrets.REDIRECT_SECRET,
    expiresInSeconds: 60, 
    payload: {
      custom_tx_id: event.transaction?.metadata?.custom_tx_id,
      continue_uri: `https://${event.secrets.TENANT_DOMAIN}/continue`
    },
  });

  api.redirect.sendUserTo(event.secrets.REDIRECT_URL, {
    query: { session_token: token }
  });
};

exports.onContinuePostLogin = async (event, api) => {
  const payload = api.redirect.validateToken({
    secret: event.secrets.REDIRECT_SECRET
  });

  console.log('Does custon_tx_id match?',
    payload?.custom_tx_id === event.transaction?.metadata?.custom_tx_id
  );
  /* Muestra "Does custon_tx_id match? True" */
};
```

<div id="preserve-values-on-forms-rendering">
  ### Conservar valores al renderizar Forms
</div>

Con [Renderizar Forms con Actions](/es/docs/customize/forms/render), los valores de los metadatos de la transacción se conservarán y seguirán estando disponibles cuando los usuarios continúen con el flujo de autenticación.

Para obtener más información sobre cómo usar Forms con Actions, consulte [Renderizar Forms con Actions](/es/docs/customize/forms/render).

**Action 1**

Establece un `custom_tx_id` en los metadatos de la transacción.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('custom_tx_id', 'xyz123');
};
```

**Action 2**

Muestra un Form. Luego registra el `custom_tx_id` que se conservó cuando continúa la ejecución de Actions.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.prompt.render(event.secrets.FORM_ID);
};

exports.onContinuePostLogin = async (event, api) => {
  console.log('custon_tx_id', event.transaction?.metadata?.custom_tx_id);
  /* Muestra "custom_tx_id xyz123" */
};
```

<div id="share-values-with-forms">
  ### Compartir valores con Forms
</div>

Puedes renderizar Forms con Actions y pasar valores de los metadatos de la transacción al Form.

**Action 1**

Establece un `custom_tx_id` en los metadatos de la transacción.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.transaction.setMetadata('custom_tx_id', 'xyz123');
};
```

**Action 2**

Renderiza un Form pasando el `custom_tx_id` de los metadatos de la transacción como parámetro `vars`. Luego, al continuar la ejecución de Actions, compara el valor de `custom_tx_id` en los metadatos de la transacción con el que se pasó al Form.

```text lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  api.prompt.render(event.secrets.FORM_ID, {
    vars: {
      custom_tx_id: event.transaction?.metadata?.custom_tx_id
    }
  });
};

exports.onContinuePostLogin = async (event, api) => {
  console.log('Does custon_tx_id match?',
    event.prompt?.vars?.custom_tx_id === event.transaction?.metadata?.custom_tx_id
  );
  /* Muestra "Does custon_tx_id match? True" */
};
```
