Envío de atributos personalizados a Amazon Cognito e ingesta en los tokens - Recomendaciones de AWS

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.

Una aplicación Node.js que emite un token de acceso con atributos personalizados para un grupo de usuarios de Amazon Cognito.

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.

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

  3. 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 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)

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 CognitoAWS (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

TareaDescripciónHabilidades requeridas

Cree un grupo de usuarios.

  1. En una terminal de CLI, ingrese el siguiente comando para crear un grupo de usuarios de Amazon Cognito:

    aws cognito-idp create-user-pool \ --pool-name <MyUserPool>
  2. Ingresa el siguiente comando para crear un ID de cliente y un secreto que se usarán con el SDK para JavaScript:

    aws cognito-idp create-user-pool-client \ --user-pool-id <UserPoolID> \ --client-name <MyNewClient> \ --no-generate-secret \ --explicit-auth-flows "USER_PASSWORD_AUTH" "ADMIN_NO_SRP_AUTH"

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.

sugerencia

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.

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:

aws cognito-idp sign-up \ --client-id <ClientID> \ --username <jane@example.com> \ --password <PASSWORD> \ --user-attributes Name="email",Value="<jane@example.com>" Name="name",Value="<Jane>"
Desarrollador de aplicaciones, AWS DevOps

Agregue el cliente de la aplicación al grupo de usuarios.

  1. Vaya a la consola de Amazon Cognito.

  2. Elija User pools (Grupos de usuarios).

  3. Elija el grupo de usuarios que creó anteriormente.

  4. En Defina su aplicación, elija el tipo de aplicación que mejor se adapte al escenario de aplicación para el que desea crear los servicios de autenticación y autorización.

  5. En Poner un nombre a la aplicación, ingrese un nombre descriptivo o continúe con el nombre predeterminado.

  6. En Agregar una URL de retorno, ingrese una ruta de redireccionamiento a su aplicación para que los usuarios completen la autenticación.

  7. Elija Cree su aplicación. Puede configurar las opciones avanzadas después de crear el cliente de la aplicación.

Administrador de sistemas de AWS, administrador de AWS DevOps, desarrollador de aplicaciones

Cree un desencadenador de Lambda anterior a la generación de tokens.

  1. Abra la página de Functions (Funciones) en la consola de Lambda.

  2. Elija Crear función.

  3. Seleccione Crear desde cero.

  4. En el panel Información básica, ingrese myPreTokenGenerationLambdaFunction en Nombre de la función.

  5. En Tiempo de ejecución, elija Node.js 22.

  6. Deje la arquitectura establecida en x86_64.

  7. Elija Crear función.

  8. En la pestaña Código, en Código fuente, ingrese la función de Lambda de ejemplo de la sección Recursos adicionales de este patrón. Esta función de Lambda inyecta los atributos personalizados en el token de ID y el token de acceso.

AWS DevOps, desarrollador de aplicaciones

Personalice el flujo de trabajo del grupo de usuarios.

  1. Vaya a la consola de Amazon Cognito.

  2. Elija User pools (Grupos de usuarios).

  3. Elija el grupo de usuarios que creó anteriormente.

  4. En el panel de navegación izquierdo, en Autenticación, elija Extensiones.

  5. Elija Agregar desencadenador de Lambda.

  6. Agregue o edite un desencadenador previo a la generación de tokens.

  7. En Tipo de desencadenador, elija Autenticación.

  8. En Autenticación, seleccione Desencadenador anterior a la generación del token.

  9. En Asignar una función de Lambda, elija myPreTokenGenerationLambdaFunction.

  10. Elija Agregar desencadenador de Lambda.

  11. Elija una opción de Versión del evento desencadenante de Características básicas con personalización del token de acceso para las identidades de los usuarios o Características básicas con personalización del token de acceso para las identidades de usuario y máquina. Esta configuración actualiza los parámetros de solicitud que Amazon Cognito envía a la función para incluir campos para la personalización del token de acceso.

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
TareaDescripciónHabilidades requeridas

Cree la aplicación Node.js.

  1. En una ventana de la terminal, ingrese los siguientes comandos:

    mkdir my-app cd my-app npm init -y npm install --save-dev typescript npm i --save-dev @types/node npm i amazon-cognito-identity-js npx tsc --init mkdir src touch src/index.ts
  2. Modifique el package.json archivo para incluir los scripts de TypeScript compilación:

    "scripts": { "start": "node src/index.js", "build": "tsc" },
Desarrollador de aplicaciones

Implemente la lógica de autenticación.

  1. Abra el archivo index.ts.

  2. Pegue el ejemplo de Typescript que se proporciona en la sección recursos adicionales de este patrón.

  3. Guarde y cierre el archivo index.ts.

nota

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:

export USERNAME="<COGNITO_USER_NAME>" export PASSWORD="<COGNITO_USER_PASSWORD>" export USER_POOL_ID="<COGNITO_USER_ID>" export CLIENT_ID="<COGNITO_CLIENT_ID>"
importante

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:

npm run build npm start
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

ProblemaSolució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

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>" }