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á.
Envie atributos personalizados para o Amazon Cognito e injete-os em tokens
Carlos Alessandro Ribeiro e Mauricio Mendoza, Amazon Web Services
Resumo
O envio de atributos personalizados para um processo de autenticação do Amazon Cognito pode fornecer contexto adicional a um aplicativo, permitir controles de acesso mais granulares e facilitar o gerenciamento de perfis de usuário e requisitos de autenticação. Esses recursos são úteis em uma ampla variedade de aplicativos e cenários e podem ajudá-lo a melhorar a segurança e a funcionalidade gerais de um aplicativo.
Esse padrão mostra como enviar atributos personalizados para um processo de autenticação do Amazon Cognito quando um aplicativo precisa fornecer contexto adicional ao token de acesso ou token de identidade (ID). Você usa o Node.js como aplicativo de back-end. O aplicativo autentica um usuário de um grupo de usuários do Amazon Cognito e transmite atributos personalizados que são necessários para a geração de tokens. Você pode usar AWS Lambda gatilhos para o Amazon Cognito para personalizar seu processo de autenticação sem grande personalização de código ou esforço significativo.
Importante
O código e as amostras desse padrão não são recomendados para cargas de trabalho de produção porque são destinados apenas para fins de demonstração. Para cargas de trabalho de produção, é necessária uma 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) que oferece suporte ao Node.js
Node.js versão 18 ou posterior, instalado
TypeScript, instalado
Limitações
Esse padrão não é aplicável à integração de aplicativos por meio do fluxo de autenticação de credenciais do cliente.
O gatilho de geração pré-token pode adicionar ou alterar somente alguns atributos do token de acesso e do token de identidade. Para obter mais informações, consulte Acionador Lambda de pré-geração de tokens na documentação do Amazon Cognito.
Arquitetura
Arquitetura de destino
O diagrama a seguir mostra a arquitetura de destino desse padrão. Também mostra como o aplicativo Node.js pode funcionar com um back-end para atualizar bancos de dados. No entanto, as atualizações do banco de dados de back-end estão fora do escopo desse padrão.

O diagrama mostra o seguinte fluxo de trabalho:
O aplicativo 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 inicia a função Lambda de pré-geração de tokens, que personaliza os tokens de acesso e ID.
O aplicativo Node.js faz uma chamada de API por meio do Amazon API Gateway.
nota
Os outros componentes arquitetônicos mostrados nessa arquitetura são apenas, por exemplo, e estão fora do escopo desse 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á-lo para criar bibliotecas ou aplicativos para o Node.js ou o navegador.
Outras ferramentas
Práticas recomendadas
Recomendamos que você implemente as seguintes práticas recomendadas:
Segredos e dados confidenciais — Não armazene segredos ou dados confidenciais no aplicativo. Use um sistema externo do qual o aplicativo possa extrair os dados, como AWS AppConfigAWS 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 CodeBuildAWS CodePipelinee.
Expiração do token — defina uma data de expiração curta para o token de acesso.
Use uma conexão segura — Toda comunicação entre o aplicativo cliente e o back-end deve ser criptografada usando 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 todas as entradas do usuário sejam validadas para evitar ataques de injeção e outras vulnerabilidades de segurança. Use bibliotecas e serviços de validação de entrada, como o Amazon API Gateway, AWS WAFpara evitar 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 do privilégio mínimo e certifique-se de que cada usuário tenha somente as permissões necessárias para desempenhar sua função.
Use uma política de senha — configure uma política de senha 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 para fornecer uma camada adicional de segurança e reduzir o risco de acesso não autorizado. Use o AWS IAM Identity CenterAmazon Cognito para habilitar o MFA e outros métodos de autenticação.
Armazene informações confidenciais com segurança — armazene informações confidenciais, como senhas e tokens de acesso, com segurança usando AWS Key Management Service (AWS KMS) ou outros serviços de criptografia.
Use métodos de autenticação fortes — Para aumentar a segurança do processo de autenticação, use métodos de autenticação fortes, como autenticação biométrica ou autenticação multifatorial.
Monitore atividades suspeitas — Use AWS CloudTrailoutras ferramentas de monitoramento para monitorar atividades suspeitas e possíveis ameaças à segurança. Configure alertas automatizados para atividades incomuns e use a Amazon GuardDuty ou AWS Security Hubpara detectar possíveis ameaças.
Revise e atualize regularmente as políticas de segurança — revise e atualize regularmente suas políticas e procedimentos de segurança para garantir que eles atendam às mudanças nos requisitos de segurança e nas melhores práticas. Use AWS Config para rastrear e auditar alterações em suas políticas e procedimentos de segurança.
Inscrição automática — Não habilite a inscrição automática 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 melhores práticas adicionais, consulte Melhores práticas de segurança para grupos de usuários do Amazon Cognito na documentação do Amazon Cognito.
Épicos
Tarefa | Descrição | 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 AWS Management Console, 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 custos, use o plano Essentials ou o plano 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. | Insira o seguinte comando para criar um usuário no grupo de usuários do Amazon Cognito:
| Desenvolvedor de aplicativos, AWS DevOps |
Adicione o cliente do aplicativo ao grupo de usuários. |
| Administrador de sistemas da AWS, administrador da AWS, AWS DevOps, desenvolvedor de aplicativos |
Crie um gatilho Lambda para geração pré-token. |
| AWS DevOps, desenvolvedor de aplicativos |
Personalize o fluxo de trabalho do grupo de usuários. |
Para obter mais informações, consulte Personalização de fluxos de trabalho de grupos de usuários com acionadores Lambda na documentação do Amazon Cognito. | AWS DevOps, desenvolvedor de aplicativos |
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Crie o aplicativo 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, insira os seguintes comandos para criar as variáveis de ambiente:
ImportanteNão codifique segredos nem exponha suas credenciais. | Desenvolvedor de aplicativos |
Execute o aplicativo. | Insira os seguintes comandos para executar o aplicativo e confirmar se ele está funcionando:
| Desenvolvedor de aplicativos |
Confirme se os atributos personalizados foram injetados nos tokens. | Use os recursos de depuração do seu IDE para visualizar os tokens de acesso e ID. Confirme se os atributos personalizados foram adicionados. Para exemplos de tokens, consulte a seção Informações adicionais desse padrão. | Desenvolvedor de aplicativos |
Solução de problemas
Problema | Solução |
---|---|
ID de cliente inválida ao tentar autenticar o usuário | Esse erro geralmente ocorre quando você está usando um ID de cliente com um segredo de cliente gerado. Você deve criar uma ID de cliente sem um segredo anexado a ela. Para obter mais informações, consulte Configurações específicas do aplicativo com clientes de aplicativos. |
Recursos relacionados
Personalização de fluxos de trabalho de grupos de usuários com gatilhos Lambda (documentação do Amazon Cognito)
Acionador Lambda de pré-geração de token (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 dos tokens de acesso e ID.
Amostra de função Lambda
O exemplo de código a seguir é uma função Lambda vinculada ao Token de pré-geração do Amazon Cognito. Ele ajuda você a personalizar o token de acesso e o token de ID que o Amazon Cognito usa. Os tokens são passados pelas integrações entre sua arquitetura. Esse exemplo inclui um atributo de declaração personalizado chamado customApplicationData
e um nome de grupo personalizado chamadoMyCustomGroup
:
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); };
Exemplo de token de acesso
Você pode decodificar o token de acesso para visualizar os atributos personalizados que foram adicionados. Veja a seguir um exemplo de token de acesso:
{ "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>" }
Exemplo de token de ID
Você pode decodificar o token de acesso para visualizar os atributos personalizados que foram adicionados. Veja a seguir um exemplo de token de acesso:
{ "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>" }