> ## 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 administrar metadatos de aplicación, metadatos de usuario y metadatos de cliente con Rules.

# Administrar metadatos con Rules

<Warning>
  La fecha de fin de vida (EOL) de Rules y Hooks será el **18 de noviembre de 2026**, y ya no están disponibles para nuevos inquilinos creados a partir del **16 de octubre de 2023**. Los inquilinos existentes con Hooks activos conservarán el acceso al producto Hooks hasta su fin de vida.

  Le recomendamos encarecidamente que use Actions para extender Auth0. Con Actions, tiene acceso a información de tipos más completa, documentación integrada y paquetes públicos de `npm`, y puede conectar integraciones externas que mejoran su experiencia general de extensibilidad. Para obtener más información sobre lo que ofrece Actions, consulte [Comprenda cómo funcionan las Actions de Auth0](/es/docs/customize/actions/actions-overview).

  Para ayudarle con la migración, ofrecemos guías que le ayudarán a [migrar de Rules a Actions](/es/docs/customize/actions/migrate/migrate-from-rules-to-actions) y [migrar de Hooks a Actions](/es/docs/customize/actions/migrate/migrate-from-hooks-to-actions). También contamos con una página dedicada, [Move to Actions](https://auth0.com/extensibility/movetoactions), que destaca comparaciones de funcionalidades, [una demostración de Actions](https://www.youtube.com/watch?v=UesFSY1klrI) y otros recursos para ayudarle en su proceso de migración.

  Para obtener más información sobre la deprecación de Rules y Hooks, lea nuestra entrada de blog: [Preparación para el fin de vida de Rules y Hooks](https://auth0.com/blog/preparing-for-rules-and-hooks-end-of-life/).
</Warning>

Puede leer, actualizar y eliminar metadatos mediante [Auth0 Rules](/es/docs/customize/rules). En las siguientes secciones, nos referiremos a este ejemplo, en el que el usuario y su información están representados por el siguiente fragmento de JSON:

```json lines theme={null}
{
  "user_id": "jdoe",
  "email": "john.doe@example.com",
  "app_metadata": {
    "roles": [ "writer" ]
  },
  "user_metadata": {
    "preferences": {
      "color": "blue"
    }
  }
}
```

<div id="read-metadata">
  ## Leer metadatos
</div>

Puede leer metadatos mediante Rules con 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>. También puede buscar información relacionada con el perfil en `user_metadata`, como:

* `name`
* `nickname`
* `given_name`
* `family_name`

De forma predeterminada, los atributos del perfil de usuario proporcionados por <Tooltip tip="Proveedor de identidad (IdP): Servicio que almacena y administra identidades digitales." cta="Ver glosario" href="/es/docs/glossary?term=identity+providers">proveedores de identidad</Tooltip> distintos de Auth0 (como Google, Facebook o X) no se pueden editar directamente porque se actualizan desde el proveedor de identidad cada vez que el usuario inicia sesión. Para obtener más información sobre los atributos de los proveedores de identidad, consulte [Configurar la conexión del proveedor de identidad para las actualizaciones del perfil de usuario](/es/docs/manage-users/user-accounts/user-profiles/configure-connection-sync-with-auth0).

Para poder editar los atributos raíz `name`, `nickname`, `given_name`, `family_name` o `picture` del perfil de usuario normalizado, debe [configurar la sincronización de su conexión con Auth0](/es/docs/manage-users/user-accounts/user-profiles/configure-connection-sync-with-auth0) para que los atributos del usuario se actualicen desde el proveedor de identidad solo cuando se cree el perfil de usuario. Estos atributos raíz quedarán disponibles para editarlos individualmente o mediante importaciones masivas

Como ejemplo, suponga que los siguientes metadatos están almacenados para un usuario con la dirección de correo electrónico `jane.doe@example.com`:

```json lines theme={null}
{
    "email": "jane.doe@example.com",
    "user_metadata": {
        "hobby": "surfing"
    },
    "app_metadata": {
        "plan": "full"
    }
}
```

Con el ejemplo de metadatos anterior, puede consultar elementos específicos del conjunto de datos en [Auth0 Rules](/es/docs/customize/rules) o mediante una llamada a la [Management API](/es/docs/manage-users/user-accounts/metadata), de la siguiente manera:

```js lines theme={null}
console.log(user.email); // "jane.doe@example.com"
console.log(user.user_metadata.hobby); // "surfing"
console.log(user.app_metadata.plan); // "full"
```

Cualquier fragmento JSON válido puede utilizarse como metadatos, pero ten en cuenta que `user.app_metadata` es `Undefined` de forma predeterminada.

Para leer los metadatos disponibles, tendrás que acceder a la propiedad correcta del usuario.

<div id="read-app-metadata">
  ### Leer los metadatos de la aplicación
</div>

Puede decidir en función de los roles del usuario:

```javascript lines theme={null}
function(user, context, callback){
  user.app_metadata = user.app_metadata || {};
  if (user.app_metadata.roles.indexOf('writer')){
    // código a ejecutar
  }
  ...
}
```

<div id="read-user-metadata">
  ### Leer los metadatos del usuario
</div>

Puede basar sus decisiones en preferencias específicas, como la preferencia de color:

```javascript lines theme={null}
function(user, context, callback){
  user.user_metadata = user.user_metadata || {};
  if (user.user_metadata.preferences.color === 'black'){
    // código a ejecutar
  }
  ...
}
```

<div id="read-application-metadata-clientmetadata">
  ### Leer los metadatos de la aplicación (`clientMetadata`)
</div>

Los metadatos de la aplicación (`clientMetadata`) son una propiedad opcional de nivel superior del objeto `context`. Las aplicaciones existentes no tendrán ningún valor asignado a esta propiedad.

```javascript lines theme={null}
function(user, context, callback){
  context.clientMetadata = context.clientMetadata || {};
  if (context.clientMetadata.usersuppliedkey1 === 'black'){
    // este código no se ejecutaría para el usuario
  }
  ...
}
```

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

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Usa Rules para asignar los atributos SAML que Auth0 recibe del IdP a `user_metadata` o `app_metadata`.
</Callout>

<div id="update-app-metadata">
  ### Actualizar los metadatos de la aplicación
</div>

Para agregar un rol de administrador al usuario:

```javascript lines theme={null}
function(user, context, callback){
  user.app_metadata = user.app_metadata || {};
  // actualizar el app_metadata que formará parte de la respuesta
  user.app_metadata.roles = user.app_metadata.roles || [];
  user.app_metadata.roles.push('administrator');

  // conservar la actualización de app_metadata
  auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
    .then(function(){
      callback(null, user, context);
    })
    .catch(function(err){
      callback(err);
    });
}
```

Esto genera la siguiente representación JSON de los detalles del perfil de usuario:

```json lines theme={null}
{
  "user_id": "jdoe",
  "email": "john.doe@example.com",
  "app_metadata": {
    "roles": [ "writer", "administrator" ]
  },
  "user_metadata": {
    "preferences": {
      "color": "blue"
    }
  }
}
```

<div id="update-user-metadata">
  ### Actualizar los metadatos del usuario
</div>

Para agregar la preferencia `fontSize` del usuario al perfil de usuario:

```javascript lines theme={null}
function(user, context, callback){
  user.user_metadata = user.user_metadata || {};
  // actualizar el user_metadata que formará parte de la respuesta
  user.user_metadata.preferences = user.user_metadata.preferences || {};
  user.user_metadata.preferences.fontSize = 12;

  // guardar la actualización de user_metadata
  auth0.users.updateUserMetadata(user.user_id, user.user_metadata)
    .then(function(){
      callback(null, user, context);
    })
    .catch(function(err){
      callback(err);
    });
}
```

Esto da como resultado la siguiente representación JSON del perfil de usuario:

```json lines theme={null}
{
  "user_id": "jdoe",
  "email": "john.doe@example.com",
  "app_metadata": {
    "roles": [ "writer" ]
  },
  "user_metadata": {
    "preferences": {
      "color": "blue",
      "fontSize": 12
    }
  }
}
```

<div id="update-app-and-user-metadata-simultaneously">
  ### Actualizar al mismo tiempo los metadatos de la aplicación y del usuario
</div>

Para reducir el tiempo de procesamiento de la Rule, puede actualizar tanto `app_metadata` como `user_metadata` en la misma Rule:

```javascript lines expandable theme={null}
function(user, context, callback){

  var q = require('q');

  user.app_metadata = user.app_metadata || {};
  user.user_metadata = user.user_metadata || {};
  // actualizar el user_metadata que formará parte de la respuesta
  user.user_metadata.preferences = user.user_metadata.preferences || {};
  user.user_metadata.preferences.fontSize = 12;

  // actualizar el app_metadata que formará parte de la respuesta
  user.app_metadata.roles = user.app_metadata.roles || [];
  user.app_metadata.roles.push('admin');

  // guardar la actualización de app_metadata
  var appMetadataPromise  = auth0.users.updateAppMetadata(user.user_id, user.app_metadata);

  // guardar la actualización de user_metadata
  var userMetadataPromise = auth0.users.updateUserMetadata(user.user_id, user.user_metadata);

  // usar la librería q para esperar a que todas las promesas se completen
  q.all([userMetadataPromise, appMetadataPromise])
    .then(function(){
      callback(null, user, context);
    })
    .catch(function(err){
      callback(err);
    });
}
```

Esto produce la siguiente representación JSON de los detalles del perfil de usuario:

```json lines theme={null}
{
  "user_id": "jdoe",
  "email": "john.doe@example.com",
  "app_metadata": {
    "roles": [ "writer", "admin" ]
  },
  "user_metadata": {
    "preferences": {
      "color": "blue",
      "fontSize": 12
    }
  }
}
```

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

<div id="delete-app-metadata-properties-and-values">
  ### Eliminar propiedades y valores de los metadatos de la aplicación
</div>

Para eliminar una propiedad, establezca su valor en `null`.

<div id="delete-users-roles-example">
  #### Ejemplo para eliminar los roles del usuario
</div>

Para eliminar los roles del usuario, use la siguiente Rule de ejemplo:

```javascript lines theme={null}
function(user, context, callback){
  user.app_metadata = user.app_metadata || {};
  // actualizar el app_metadata que formará parte de la respuesta
  user.app_metadata.roles = null;

  // conservar la actualización del app_metadata
  auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
    .then(function(){
      callback(null, user, context);
    })
    .catch(function(err){
      callback(err);
    });
}
```

Esto da lugar a la siguiente representación JSON del perfil de usuario:

```json lines theme={null}
{
  "user_id": "jdoe",
  "email": "john.doe@example.com",
  "app_metadata": { },
  "user_metadata": {
    "preferences": {
      "color": "blue"
    }
  }
}
```

<div id="delete-single-property-value-example">
  #### Ejemplo de cómo eliminar un único valor de una propiedad
</div>

Para eliminar un único valor de una propiedad, quite ese valor concreto. Por ejemplo, para quitar el rol `writer` del perfil de usuario:

```javascript lines theme={null}
function(user, context, callback){
  user.app_metadata = user.app_metadata || {};
  user.app_metadata.roles = user.app_metadata.roles || [];

  var index = user.app_metadata.roles.indexOf('writer');

  if (index !== -1){
    // actualizar el app_metadata que formará parte de la respuesta
    user.app_metadata.roles.splice(index, 1);
  }

  // guardar la actualización del app_metadata
  auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
    .then(function(){
      callback(null, user, context);
    })
    .catch(function(err){
      callback(err);
    });
}
```

Esto da lugar a la siguiente representación JSON del perfil de usuario:

```json lines theme={null}
{
  "user_id": "google-oauth2|1234",
  "email": "john.doe@gmail.com",
  "app_metadata": {
    "roles": [ ]
  },
  "user_metadata": {
    "preferences": {
      "color": "blue"
    }
  }
}
```

Ten en cuenta que la propiedad `roles` sigue existiendo, pero no contiene ningún valor.

<div id="delete-user-metadata-properties-and-values">
  ### Eliminar propiedades y valores de los metadatos del usuario
</div>

Para eliminar la preferencia de color del usuario:

```javascript lines theme={null}
function(user, context, callback){
  user.user_metadata = user.user_metadata || {};
  // actualizar el user_metadata que formará parte de la respuesta
  user.user_metadata.preferences = user.user_metadata.preferences || {};
  delete user.user_metadata.preferences.color;

  // guardar la actualización de user_metadata
  auth0.users.updateUserMetadata(user.user_id, user.user_metadata)
    .then(function(){
      callback(null, user, context);
    })
    .catch(function(err){
      callback(err);
  });
}
```

El resultado es la siguiente representación JSON de los detalles del perfil de usuario:

```json lines theme={null}
{
  "user_id": "jdoe",
  "email": "john.doe@example.com",
  "app_metadata": {
    "roles": [ "writer" ]
  },
  "user_metadata": {
    "preferences": { }
  }
}
```

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

* [Uso de la Management API desde Rules](/es/docs/customize/rules/use-management-api)
* [Propiedades del objeto de contexto en Rules](/es/docs/customize/rules/context-object)
* [Auth0 Rules](/es/docs/customize/rules)
