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
Carlos Alessandro Ribeiro y Mauricio Mendoza, Amazon Web Services
Resumen
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 o al token de identidad (ID). Debe usar Node.js como aplicación de backend. La aplicación autentica a un usuario de un grupo de usuarios de Amazon Cognito y transfiere los atributos personalizados necesarios para la generación de los tokens. Puede utilizar los desencadenadores de AWS Lambda 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
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 y configurado
Un entorno de desarrollo integrado (IDE) que admita Node.js.
La versión 18 o posterior de Node.js instalada
. La versión 8 o posterior de npm instalada
. TypeScript instalado
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 en la documentación de Amazon Cognito.
Arquitectura
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.

En el diagrama, se muestra el siguiente flujo de trabajo:
La aplicación Node.js emite un token de acceso con atributos personalizados para el grupo de usuarios de Amazon Cognito.
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.
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 CloudFormationmediante Terraform o cualquier herramienta de infraestructura como código (IaC) compatible. AWS Cloud Development Kit (AWS CDK)HashiCorp
Tools (Herramientas)
Servicios de AWS
Amazon API Gateway le ayuda a crear, publicar, mantener, supervisar y proteger REST, HTTP y WebSocket APIs a cualquier escala.
Amazon Cognito ofrece autenticación, autorización y administración de usuarios para aplicaciones móviles y web.
Amazon Elastic Container Service (Amazon ECS) 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 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 JavaScriptproporciona una JavaScript API para Servicios de AWS. Puede usarla para crear bibliotecas o aplicaciones para Node.js o el navegador.
Otras herramientas
Node.js
es un entorno de JavaScript ejecución basado en eventos que está diseñado para crear aplicaciones de red escalables. 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
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, AWS Secrets Manager o Almacén de parámetros de AWS Systems Manager.
Implementación estandarizada: utilice CI/CD canalizaciones para implementar sus aplicaciones. Puede utilizar servicios como AWS CodeBuild y AWS CodePipeline.
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) para generar y gestionar SSL/TLS certificados, y utilice Amazon CloudFront o Elastic Load Balancing 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 para evitar los vectores de ataque más comunes.
Utilice funciones de IAM: utilice funciones AWS Identity and Access Management (IAM) 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 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) 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 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 o AWS Security Hub CSPMpara 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
AWS (entrada del blog).
Para obtener más información sobre las prácticas recomendadas, consulte Security best practices for Amazon Cognito user pools en la documentación de Amazon Cognito.
Epics
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Cree un grupo de usuarios. |
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 y Añadir más funciones y opciones de seguridad a su grupo de usuarios. sugerenciaPara 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 | 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:
| Desarrollador de aplicaciones, AWS DevOps |
Agregue el cliente de la aplicación al grupo de usuarios. |
| Administrador de sistemas de AWS, administrador de AWS DevOps, desarrollador de aplicaciones |
Cree un desencadenador de Lambda anterior a la generación de tokens. |
| AWS DevOps, desarrollador de aplicaciones |
Personalice el flujo de trabajo del grupo de usuarios. |
Para obtener más información, consulte Customizing user pool workflows with Lambda triggers en la documentación de Amazon Cognito. | AWS DevOps, desarrollador de aplicaciones |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Cree la aplicación Node.js. |
| Desarrollador de aplicaciones |
Implemente la lógica de autenticación. |
notaPuede 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:
importanteNo 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:
| 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 de este patrón. | Desarrollador de aplicaciones |
Resolución de problemas
| 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. |
Recursos relacionados
Customizing user pool workflows with Lambda triggers (documentación de Amazon Cognito)
Pre token generation Lambda trigger (documentación de Amazon Cognito)
CognitoIdentityProviderClient(AWS SDK para JavaScript documentación)
cognito-idp
(documentación)AWS CLI
Información adicional
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 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>" }