

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Envío de atributos personalizados a Amazon Cognito e ingesta en los tokens
<a name="send-custom-attributes-cognito"></a>

*Carlos Alessandro Ribeiro y Mauricio Mendoza, Amazon Web Services*

## Resumen
<a name="send-custom-attributes-cognito-summary"></a>

El envío de atributos personalizados a un proceso de autenticación de Amazon Cognito puede proporcionar contexto adicional a una aplicación, permitir controles de acceso más detallados y facilitar la administración de los perfiles de usuario y los requisitos de autenticación. Estas características son útiles en una amplia gama de aplicaciones y escenarios, y pueden ser de ayuda para mejorar la seguridad y la funcionalidad generales de una aplicación.

Este patrón muestra cómo enviar atributos personalizados a un proceso de autenticación de Amazon Cognito cuando una aplicación necesita proporcionar contexto adicional al [token de acceso](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html) o al [token de identidad (ID)](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html). Debe usar Node.js como aplicación de backend. La aplicación autentica a un usuario de un [grupo de usuarios](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools.html) de Amazon Cognito y transfiere los atributos personalizados necesarios para la generación de los tokens. Puede utilizar los [desencadenadores de AWS Lambda](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html) de Amazon Cognito para personalizar el proceso de autenticación sin necesidad de una personalización importante del código ni un esfuerzo significativo.

**importante**  
El código y los ejemplos de este patrón no se recomiendan para las cargas de trabajo de producción porque están destinados únicamente a fines de demostración. Para las cargas de trabajo de producción, se requiere una configuración adicional del cliente. Utilice este patrón como referencia únicamente con fines piloto o proof-of-concept con fines específicos.

## Requisitos previos y limitaciones
<a name="send-custom-attributes-cognito-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS
+ Permisos para crear y gestionar grupos de usuarios y funciones de Amazon Cognito AWS Lambda 
+ AWS Command Line Interface [(AWS CLI), [instalado](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) y configurado](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ Un entorno de desarrollo integrado (IDE) que admita Node.js.
+ La versión 18 o posterior de Node.js [instalada](https://nodejs.org/en/download/).
+ La versión 8 o posterior de npm [instalada](https://docs.npmjs.com/getting-started).
+ TypeScript [instalado](https://www.typescriptlang.org/download/)

**Limitaciones**
+ Este patrón no se aplica a la integración de aplicaciones a través del flujo de autenticación de credenciales de cliente.
+ El desencadenador previo a la generación del token puede agregar o cambiar solo algunos atributos del token de acceso y del token de identidad. Para obtener más información, consulte [Pre token generation Lambda trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html) en la documentación de Amazon Cognito.

## Arquitectura
<a name="send-custom-attributes-cognito-architecture"></a>

**Arquitectura de destino**

El siguiente diagrama muestra la arquitectura de destino para este patrón. También muestra cómo podría funcionar la aplicación Node.js con un backend para actualizar las bases de datos. Sin embargo, las actualizaciones de la base de datos de backend quedan fuera del alcance de este patrón.

![Una aplicación Node.js que emite un token de acceso con atributos personalizados para un grupo de usuarios de Amazon Cognito.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/9f0855e6-77f9-48c2-846e-f9c317127e1f/images/8c52c88b-8954-4b4c-aed3-fd8c22f84c1d.png)


En el diagrama, se muestra el siguiente flujo de trabajo:

1. La aplicación Node.js emite un token de acceso con atributos personalizados para el grupo de usuarios de Amazon Cognito.

1. El grupo de usuarios de Amazon Cognito inicia la función de Lambda previa a la generación del token, que personaliza los tokens de acceso e ID.

1. La aplicación Node.js realiza una llamada a la API a través de Amazon API Gateway.

**nota**  
Los demás componentes arquitectónicos que se muestran en esta arquitectura son solo de ejemplo y están fuera del alcance de este patrón.

**Automatización y escala**

[Puede automatizar el aprovisionamiento de grupos de usuarios AWS Lambda , funciones, instancias de bases de datos y otros recursos de Amazon Cognito [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)mediante Terraform o cualquier herramienta de infraestructura como código (IaC) compatible. [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)HashiCorp ](https://www.terraform.io/docs) Si desea escalar sus implementaciones, utilice canalizaciones de integración y entrega continuas (CI/CD), que ayudan a evitar los errores asociados con las implementaciones manuales.

## Tools (Herramientas)
<a name="send-custom-attributes-cognito-tools"></a>

**Servicios de AWS**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) le ayuda a crear, publicar, mantener, supervisar y proteger REST, HTTP y WebSocket APIs a cualquier escala.
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) ofrece autenticación, autorización y administración de usuarios para aplicaciones móviles y web.
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) es un servicio de administración de contenedores escalable y rápido que ayuda a ejecutar, detener y administrar contenedores en un clúster.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.
+ [AWS SDK para JavaScript](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html)proporciona una JavaScript API para Servicios de AWS. Puede usarla para crear bibliotecas o aplicaciones para Node.js o el navegador.

**Otras herramientas**
+ [Node.js](https://nodejs.org/en/docs/) es un entorno de JavaScript ejecución basado en eventos que está diseñado para crear aplicaciones de red escalables.
+ [npm](https://docs.npmjs.com/about-npm) es un registro de software que se ejecuta en un entorno Node.js y se utiliza para compartir o tomar prestados paquetes y administrar la implementación de paquetes privados.

## Prácticas recomendadas
<a name="send-custom-attributes-cognito-best-practices"></a>

Recomendamos que siga las siguientes prácticas recomendadas:
+ **Secretos e información confidencial**: no almacene secretos ni información confidencial en la aplicación. Utilice un sistema externo del que la aplicación pueda extraer los datos, como [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html), [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) o [Almacén de parámetros de AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html).
+ **Implementación estandarizada**: utilice CI/CD canalizaciones para implementar sus aplicaciones. Puede utilizar servicios como [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) y [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html).
+ **Caducidad del token**: establezca una fecha de caducidad corta para el token de acceso.
+ **Uso de una conexión segura**: todas las comunicaciones entre la aplicación cliente y el backend deben cifrarse mediante SSL/TLS. Utilice [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) para generar y gestionar SSL/TLS certificados, y utilice [Amazon CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) o [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) para gestionar la SSL/TLS rescisión.
+ **Validación de las entradas del usuario**: asegúrese de que todas las entradas del usuario estén validadas para evitar ataques por inyección de código y otras vulnerabilidades de seguridad. Utilice bibliotecas y servicios de validación de entradas, como Amazon API Gateway y [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/what-is-aws-waf.html#waf-intro) para evitar los vectores de ataque más comunes.
+ **Utilice funciones de IAM: utilice funciones AWS Identity and Access Management ** [(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) para controlar el acceso a AWS los recursos y asegurarse de que solo los usuarios autorizados tengan acceso. Siga el principio de privilegio mínimo y asegúrese de que cada usuario tenga los permisos necesarios para realizar su rol.
+ **Uso de una política de contraseñas**: configure una política de contraseñas que cumpla con sus requisitos de seguridad, como la longitud mínima, la complejidad y la caducidad. Utilice Secrets Manager o AWS Systems Manager Parameter Store para almacenar y gestionar las contraseñas de forma segura.
+ **Activación de la autenticación multifactor (MFA)**: habilite la MFA para todos los usuarios a fin de proporcionar una capa adicional de seguridad y reducir el riesgo de acceso no autorizado. Utilice [AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) o Amazon Cognito para habilitar la MFA y otros métodos de autenticación.
+ **Almacenamiento seguro de la información confidencial**: almacene la información confidencial, como contraseñas y tokens de acceso, de forma segura mediante [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) u otros servicios de cifrado.
+ **Uso de métodos de autenticación sólidos**: para aumentar la seguridad del proceso de autenticación, utilice métodos de autenticación sólidos, como la autenticación biométrica o la autenticación multifactor.
+ **Supervisión de la actividad sospechosa**: utilice [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) y otras herramientas de supervisión para detectar actividades sospechosas y posibles amenazas a la seguridad. Configura alertas automatizadas para detectar actividades inusuales y utiliza [Amazon GuardDuty](https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html) o [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html)para detectar posibles amenazas.
+ **Revisión y actualización periódicas de las políticas de seguridad**: revise y actualice periódicamente sus políticas y procedimientos de seguridad para asegurarse de que cumplan con los cambiantes requisitos de seguridad y sus prácticas recomendadas. Úselo AWS Config para realizar un seguimiento y auditar los cambios en sus políticas y procedimientos de seguridad.
+ **Registro automático**: no habilite el registro automático en un grupo de usuarios de Amazon Cognito. Para obtener más información, consulte [Reducir los riesgos de fraude en el registro de usuarios y la transferencia de SMS con los grupos de usuarios de Amazon Cognito](https://aws.amazon.com/blogs/security/reduce-risks-of-user-sign-up-fraud-and-sms-pumping-with-amazon-cognito-user-pools/)AWS (entrada del blog).

Para obtener más información sobre las prácticas recomendadas, consulte [Security best practices for Amazon Cognito user pools](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-security-best-practices.html) en la documentación de Amazon Cognito.

## Epics
<a name="send-custom-attributes-cognito-epics"></a>

### Configure los recursos AWS
<a name="set-up-the-aws-resources"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un grupo de usuarios. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/send-custom-attributes-cognito.html)Para obtener más información e instrucciones sobre cómo configurar un grupo de usuarios en el Consola de administración de AWS, consulte [Introducción a los grupos de usuarios](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-user-pools.html) y [Añadir más funciones y opciones de seguridad a su grupo de usuarios](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-next-steps.html).Para reducir los costos, utilice el plan Essentials o el plan Lite para probar este patrón. Para obtener más información, consulte [Precios de Amazon Cognito](https://aws.amazon.com/cognito/pricing/). | Desarrollador de aplicaciones, AWS DevOps | 
| Agregue un usuario al grupo de usuarios. | Ingrese el siguiente comando para crear un usuario en el grupo de usuarios de Amazon Cognito:<pre>aws cognito-idp sign-up \<br />   --client-id <ClientID> \<br />   --username <jane@example.com> \<br />   --password <PASSWORD> \<br />   --user-attributes Name="email",Value="<jane@example.com>" Name="name",Value="<Jane>"</pre> | Desarrollador de aplicaciones, AWS DevOps | 
| Agregue el cliente de la aplicación al grupo de usuarios. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/send-custom-attributes-cognito.html) | Administrador de sistemas de AWS, administrador de AWS DevOps, desarrollador de aplicaciones | 
| Cree un desencadenador de Lambda anterior a la generación de tokens. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/send-custom-attributes-cognito.html) | AWS DevOps, desarrollador de aplicaciones | 
| Personalice el flujo de trabajo del grupo de usuarios. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/send-custom-attributes-cognito.html)Para obtener más información, consulte [Customizing user pool workflows with Lambda triggers](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html) en la documentación de Amazon Cognito. | AWS DevOps, desarrollador de aplicaciones | 

### Creación de la aplicación Node.js
<a name="create-the-node-js-application"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree la aplicación Node.js. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/send-custom-attributes-cognito.html) | Desarrollador de aplicaciones | 
| Implemente la lógica de autenticación. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/send-custom-attributes-cognito.html)Puede crear su propio TypeScript archivo o modificar la muestra proporcionada según sea necesario para su caso de uso. | Desarrollador de aplicaciones | 
| Configure las variables de entorno y el archivo de configuración. | En una terminal, ingrese los siguientes comandos para crear las variables de entorno:<pre>export USERNAME="<COGNITO_USER_NAME>"<br />export PASSWORD="<COGNITO_USER_PASSWORD>"<br />export USER_POOL_ID="<COGNITO_USER_ID>"<br />export CLIENT_ID="<COGNITO_CLIENT_ID>"</pre>No codifique los secretos ni exponga sus credenciales. | Desarrollador de aplicaciones | 
| Ejecute la aplicación . | Ingrese los siguientes comandos para poner en marcha la aplicación y confirmar que funciona:<pre>npm run build<br />npm start</pre> | Desarrollador de aplicaciones | 
| Confirme que los atributos personalizados estén insertados en los tokens. | Utilice las características de depuración de su IDE para ver los tokens de acceso e ID. Confirme que se hayan agregado los atributos personalizados. Para ver ejemplos de tokens, consulte la sección [Información adicional](#send-custom-attributes-cognito-additional) de este patrón. | Desarrollador de aplicaciones | 

## Resolución de problemas
<a name="send-custom-attributes-cognito-troubleshooting"></a>


| Problema | Solución | 
| --- | --- | 
| El ID de cliente no es válido al intentar autenticar al usuario | Este error suele producirse cuando se utiliza un ID de cliente con un secreto de cliente generado. Debe crear un ID de cliente sin ningún secreto adjunto. Para obtener más información, consulte [Application-specific settings with app clients](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-client-apps.html). | 

## Recursos relacionados
<a name="send-custom-attributes-cognito-resources"></a>
+ [Customizing user pool workflows with Lambda triggers](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html) (documentación de Amazon Cognito)
+ [Pre token generation Lambda trigger](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html) (documentación de Amazon Cognito)
+ [CognitoIdentityProviderClient](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/cognito-identity-provider/)(AWS SDK para JavaScript documentación)
+ [cognito-idp](https://awscli.amazonaws.com/v2/documentation/api/2.0.34/reference/cognito-idp/index.html#cli-aws-cognito-idp) (documentación)AWS CLI 

## Información adicional
<a name="send-custom-attributes-cognito-additional"></a>

**Archivo de TypeScript muestra**

El siguiente ejemplo de código es un TypeScript archivo que invoca el proceso de autenticación mediante un AWS SDK para enviar atributos personalizados a Amazon Cognito:

```
import * as AmazonCognitoIdentity from "amazon-cognito-identity-js";

const userPoolId: string = process.env.USER_POOL_ID ?? '';
const clientId: string = process.env.CLIENT_ID ?? '';

const poolData = {
  UserPoolId: userPoolId,
  ClientId: clientId
};
const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

export const loginWithCognitoSDK = function (userName: string, password: string) {
  const authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails({
    Username: userName,
    Password: password,
    ClientMetadata: {
        customGroup: "MyCustomGroup",
        customApplicationData: "Custom data from a custom application"
    }
  });
  const userData = {
    Username: userName,
    Pool: userPool
  };

  const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

  // Authenticate the user using the authenticationDetails object
  cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function (result: any) {},
    onFailure: function (err: any) {},
  });
}
loginWithCognitoSDK(process.env.USERNAME ?? '', process.env.PASSWORD ?? '');
```

En el ejemplo se utiliza el `AuthenticationDetails` modelo del SDK JavaScript para proporcionar el nombre de usuario, la contraseña y el. `ClientMetadada` Tras la autenticación en Amazon Cognito, los metadatos del cliente se pueden recuperar de los tokens de acceso e ID.

**Función de Lambda de ejemplo**

El siguiente código de ejemplo es una función de Lambda vinculada al [token de pregeneración](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html) de Amazon Cognito. Le permite personalizar el token de acceso y el token de ID que utiliza Amazon Cognito. Los tokens se transfieren a través de las integraciones entre su arquitectura. Este ejemplo incluye un atributo de notificación personalizado denominado `customApplicationData` y un nombre de grupo personalizado denominado `MyCustomGroup`:

```
export const handler = async(event, context, callback) => {
    event.response = {
        claimsOverrideDetails: {
            claimsToAddOrOverride: { customApplicationData: event.request.clientMetadata.customApplicationData },
            groupOverrideDetails: { groupsToOverride: [event.request.clientMetadata.customGroup] }
        }
    };
    callback(null, event);
};
```

**Ejemplo de token de acceso**

Puede decodificar el token de acceso para visualizar los atributos personalizados que se agregaron. El siguiente es un ejemplo de token de acceso:

```
{
  "sub": "6daf331f-4451-48b4-abde-774579299204",
  "cognito:groups": [
    "MyCustomGroup"
  ],
  "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>",
  "client_id": "<YOUR_CLIENT_ID>",
  "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc",
  "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e",
  "token_use": "access",
  "scope": "aws.cognito.signin.user.admin",
  "auth_time": 1677979246,
  "exp": 1677982846,
  "iat": 1677979246,
  "jti": "5c9c2708-a871-4428-bd9b-18ad261bea90",
  "username": "<USER_NAME>"
}
```

**Ejemplo de token de identificación**

Puede decodificar el token de acceso para visualizar los atributos personalizados que se agregaron. El siguiente es un ejemplo de token de acceso:

```
{
  "sub": "6daf331f-4451-48b4-abde-774579299204",
  "cognito:groups": [
    "MyCustomGroup"
  ],
  "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>",
  "cognito:username": "<USER_NAME>",
  "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc",
  "customApplicationData": "Custom data from a custom application",
  "aud": "<YOUR_CLIENT_ID>",
  "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e",
  "token_use": "id",
  "auth_time": 1677979246,
  "exp": 1677982846,
  "iat": 1677979246,
  "jti": "f7ca006b-f25b-44d2-a7a4-6e6423f4201f",
  "email": "<USER_EMAIL>"
}
```