As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Envio de atributos personalizados para o Amazon Cognito e injeção desses atributos em tokens
Carlos Alessandro Ribeiro e Mauricio Mendoza, Amazon Web Services
Resumo
O envio de atributos personalizados ao processo de autenticação do Amazon Cognito pode fornecer contexto adicional à aplicação, possibilitar controles de acesso mais detalhados e facilitar o gerenciamento de perfis de usuário e requisitos de autenticação. Esses recursos são úteis em uma ampla variedade de aplicações e cenários, e podem contribuir para aprimorar tanto a segurança quanto a performance de uma aplicação.
Este padrão apresenta como enviar atributos personalizados para o processo de autenticação do Amazon Cognito sempre que uma aplicação necessitar adicionar informações ao token de acesso ou ao token de identidade (ID). Você emprega o Node.js como backend da aplicação A aplicação autentica um usuário com base em um grupo de usuários do Amazon Cognito e fornece os atributos personalizados necessários para a geração do token. Você pode usar os acionadores do AWS Lambda para o Amazon Cognito a fim de personalizar o processo de autenticação sem necessidade de modificações complexas no código ou esforço significativo.
Importante
O código e os exemplos deste padrão não são recomendados para workloads em produção, pois destinam-se apenas a fins de demonstração. Para workloads de produção, é necessária configuração adicional no lado do cliente. Use esse padrão como referência apenas para fins piloto ou para proof-of-concept fins.
Pré-requisitos e limitações
Pré-requisitos
Um ativo Conta da AWS
Permissões para criar e gerenciar grupos de usuários e funções do Amazon Cognito AWS Lambda
AWS Command Line Interface (AWS CLI), instalado e configurado
Um ambiente de desenvolvimento integrado (IDE) com suporte para Node.js
Node.js, versão 18 ou versões posteriores, instalado
npm versão 8 ou versões posteriores, instalado
O TypeScript, instalado
Limitações
Este padrão não é aplicável à integração de aplicações por meio do fluxo de autenticação de credenciais de clientes.
Com o acionador para executar antes da geração de tokens, é possível adicionar ou alterar apenas determinados atributos do token de acesso e do token de identidade. Para obter mais informações, consulte Pre token generation Lambda trigger na documentação do Amazon Cognito.
Arquitetura
Arquitetura de destino
O diagrama apresentado a seguir ilustra a arquitetura de destino para este padrão. O diagrama também mostra como a aplicação do Node.js pode funcionar com um backend para atualizar bancos de dados. No entanto, as atualizações do banco de dados pelo backend não fazem parte do escopo deste padrão.

O diagrama mostra o seguinte fluxo de trabalho:
A aplicação do Node.js emite um token de acesso com atributos personalizados para o grupo de usuários do Amazon Cognito.
O grupo de usuários do Amazon Cognito aciona a função do Lambda para executar antes da geração de tokens, que personaliza os tokens de acesso e de identidade.
A aplicação do Node.js realiza uma chamada de API por meio do Amazon API Gateway.
nota
Os demais componentes da arquitetura apresentados são apenas ilustrativos e não fazem parte do escopo deste padrão.
Automação e escala
Você pode automatizar o provisionamento de grupos de usuários, AWS Lambda funções, instâncias de banco de dados e outros recursos do Amazon Cognito usando AWS CloudFormationo HashiCorp Terraform
Ferramentas
Serviços da AWS
O Amazon API Gateway ajuda você a criar, publicar, manter, monitorar e proteger REST, HTTP e WebSocket APIs em qualquer escala.
O Amazon Cognito fornece autenticação, autorização e gerenciamento de usuários para suas aplicações Web e móveis.
O Amazon Elastic Container Service (Amazon ECS) é um serviço de gerenciamento de contêineres escalável e rápido que facilita a execução, a interrupção e o gerenciamento de contêineres em um cluster.
O AWS Lambda é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.
AWS SDK para JavaScriptfornece uma JavaScript API para Serviços da AWS. Você pode usá-la para criar bibliotecas ou aplicações para Node.js ou para o navegador.
Outras ferramentas
Práticas recomendadas
Recomendamos que você implemente as seguintes práticas recomendadas:
Segredos e dados sensíveis: não armazene segredos ou dados sensíveis dentro da aplicação. Em vez disso, use um sistema externo no qual a aplicação possa obter essas informações, como AWS AppConfig, AWS Secrets Manager ou AWS Systems Manager Parameter Store.
Implantação padronizada — Use CI/CD pipelines para implantar seus aplicativos. Você pode usar serviços como AWS CodeBuild e AWS CodePipeline.
Expiração do token: defina um prazo de expiração curto para o token de acesso.
Use uma conexão segura: toda a comunicação entre a aplicação cliente e o backend deve ser criptografada utilizando SSL/TLS. Use AWS Certificate Manager (ACM) para gerar e gerenciar SSL/TLS certificados e use a Amazon CloudFront ou o Elastic Load Balancing para lidar com a SSL/TLS rescisão.
Validar a entrada do usuário: certifique-se de que toda entrada do usuário seja validada para prevenir ataques de injeção e outras vulnerabilidades de segurança. Use bibliotecas de validação de entrada e serviços como o Amazon API Gateway e o AWS WAF para prevenir vetores de ataque comuns.
Use funções do IAM — Use funções AWS Identity and Access Management (IAM) para controlar o acesso aos AWS recursos e garantir que somente usuários autorizados tenham acesso. Siga o princípio de privilégio mínimo e assegure que cada usuário tenha somente as permissões necessárias para seu perfil.
Use uma política de senhas: configure uma política de senhas que atenda aos seus requisitos de segurança, como tamanho mínimo, complexidade e expiração. Use o Secrets Manager ou o AWS Systems Manager Parameter Store para armazenar e gerenciar senhas com segurança.
Habilite a autenticação multifator (MFA): habilite a MFA para todos os usuários a fim de fornecer uma camada adicional de segurança e reduzir o risco de acessos não autorizados. Use o Centro de Identidade do AWS IAM ou o Amazon Cognito para habilitar a MFA e outros métodos de autenticação.
Armazene informações sensíveis com segurança: armazene informações sensíveis, como senhas e tokens de acesso, de forma segura usando o AWS Key Management Service (AWS KMS) ou outros serviços de criptografia.
Use métodos de autenticação robustos: para aumentar a segurança do processo de autenticação, utilize métodos de autenticação robustos, como a autenticação biométrica ou a autenticação multifator.
Monitore atividades suspeitas: use o AWS CloudTrail e outras ferramentas de monitoramento para acompanhar atividades suspeitas e possíveis ameaças à segurança. Configure alertas automatizados para atividades incomuns e use a Amazon GuardDuty ou AWS Security Hub CSPMpara detectar possíveis ameaças.
Revise e atualize regularmente as políticas de segurança: analise e atualize periodicamente as políticas e os procedimentos de segurança para garantir que atendam aos requisitos de segurança em constante mudança e às práticas recomendadas. Use AWS Config para rastrear e auditar alterações em suas políticas e procedimentos de segurança.
Cadastro automático: não habilite o cadastro automatizado em um grupo de usuários do Amazon Cognito. Para obter mais informações, consulte Reduzir os riscos de fraude na inscrição de usuários e envio de SMS com grupos de usuários do Amazon Cognito
AWS (postagem no blog).
Para obter práticas recomendadas adicionais, consulte Security best practices for Amazon Cognito user pools na documentação do Amazon Cognito.
Épicos
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Criar um grupo de usuários. |
Para obter mais informações e instruções sobre como configurar um grupo de usuários no Console de gerenciamento da AWS, consulte Introdução aos grupos de usuários e Adicionar mais recursos e opções de segurança ao seu grupo de usuários. dicaPara reduzir os custos, experimente o plano Essentials ou Lite para testar esse padrão. Para mais informações, consulte Preço do Amazon Cognito | Desenvolvedor de aplicativos, AWS DevOps |
Adicione um usuário ao grupo de usuários. | Digite o seguinte comando para criar um usuário no grupo de usuários do Amazon Cognito:
| Desenvolvedor de aplicativos, AWS DevOps |
Adicione o cliente da aplicação ao grupo de usuários. |
| Administrador de sistemas da AWS, administrador da AWS, AWS DevOps, desenvolvedor de aplicativos |
Crie um acionador do Lambda para executar antes da geração de tokens. |
| AWS DevOps, desenvolvedor de aplicativos |
Personalize o fluxo de trabalho do grupo de usuários. |
Para obter mais informações, consulte Customizing user pool workflows with Lambda triggers na documentação do Amazon Cognito. | AWS DevOps, desenvolvedor de aplicativos |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Crie a aplicação do Node.js. |
| Desenvolvedor de aplicativos |
Implemente a lógica de autenticação. |
notaVocê pode criar seu próprio TypeScript arquivo ou modificar a amostra fornecida conforme necessário para seu caso de uso. | Desenvolvedor de aplicativos |
Configure as variáveis de ambiente e o arquivo de configuração. | Em um terminal, digite os seguintes comandos para criar as variáveis de ambiente:
ImportanteNão codifique segredos diretamente nem exponha suas credenciais. | Desenvolvedor de aplicativos |
Execute a aplicação . | Digite os seguintes comandos para executar a aplicação e confirmar que está funcionando:
| Desenvolvedor de aplicativos |
Confirme se os atributos personalizados foram inseridos nos tokens. | Use os recursos de depuração do seu IDE para visualizar os tokens de acesso e de ID. Confirme se os atributos personalizados foram adicionados. Para obter tokens de amostra, consulte a seção Informações adicionais deste padrão. | Desenvolvedor de aplicativos |
Solução de problemas
| Problema | Solução |
|---|---|
ID de cliente inválida ao tentar autenticar o usuário | Este erro geralmente ocorre quando você usa uma ID de cliente com um segredo do cliente gerado. É necessário criar uma ID de cliente que não tenha um segredo vinculado. Para obter mais informações, consulte Application-specific settings with app clients. |
Recursos relacionados
Customizing user pool workflows with Lambda triggers (documentação do Amazon Cognito)
Pre token generation Lambda trigger (documentação do Amazon Cognito)
CognitoIdentityProviderClient(AWS SDK para JavaScript documentação)
cognito-idp
(documentação)AWS CLI
Mais informações
TypeScript Arquivo de amostra
O exemplo de código a seguir é um TypeScript arquivo que invoca o processo de autenticação usando um AWS SDK para enviar atributos personalizados ao 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 ?? '');
A amostra usa o AuthenticationDetails modelo do SDK JavaScript para fornecer o nome de usuário, a senha e o. ClientMetadada Após a autenticação no Amazon Cognito, os metadados do cliente podem ser recuperados usando os tokens de acesso e de ID.
Amostra de função Lambda
A amostra de código apresentada a seguir é uma função do Lambda vinculada ao token de pré-geração do Amazon Cognito. A função ajuda você a personalizar o token de acesso e o token de ID utilizados pelo Amazon Cognito. Os tokens são transmitidos por meio das integrações da sua arquitetura. Esta amostra inclui um atributo de declaração personalizado chamado customApplicationData e um nome de grupo personalizado chamado 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); };
Token de acesso de amostra
É possível decodificar o token de acesso para visualizar os atributos personalizados que foram adicionados. Abaixo, apresentamos um token de acesso de amostra:
{ "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>" }
Token de ID de amostra
É possível decodificar o token de acesso para visualizar os atributos personalizados que foram adicionados. Abaixo, apresentamos um token de acesso de amostra:
{ "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>" }