Envio de atributos personalizados para o Amazon Cognito e injeção desses atributos em tokens - Recomendações da AWS

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.

Uma aplicação do Node.js que emite um token de acesso com atributos personalizados para um grupo de usuários do Amazon Cognito.

O diagrama mostra o seguinte fluxo de trabalho:

  1. A aplicação do Node.js emite um token de acesso com atributos personalizados para o grupo de usuários do Amazon Cognito.

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

  3. 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 ou qualquer AWS Cloud Development Kit (AWS CDK)ferramenta de infraestrutura como código (IaC) compatível. Se você deseja escalar suas implantações, use pipelines de integração e entrega contínuas (CI/CD), que ajudam a evitar erros associados a implantações manuais.

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

  • O Node.js é um ambiente de tempo de JavaScript execução orientado a eventos, projetado para criar aplicativos de rede escaláveis.

  • O npm é um registro de software executado em um ambiente Node.js e usado para compartilhar ou emprestar pacotes e gerenciar a implantação de pacotes privados.

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

TarefaDescriptionHabilidades necessárias

Criar um grupo de usuários.

  1. Em um terminal da CLI, digite o seguinte comando para criar um grupo de usuários do Amazon Cognito:

    aws cognito-idp create-user-pool \ --pool-name <MyUserPool>
  2. Digite o comando a seguir para criar um ID de cliente e um segredo que serão usados com o 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 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.

dica

Para 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:

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>"
Desenvolvedor de aplicativos, AWS DevOps

Adicione o cliente da aplicação ao grupo de usuários.

  1. Acesse o console do Amazon Cognito.

  2. Escolha User Pools (Grupos de usuários).

  3. Escolha o grupo de usuários que você criou anteriormente.

  4. Em Definir a aplicação, escolha o tipo de aplicação que melhor se adequa ao cenário para o qual você deseja criar os serviços de autenticação e autorização.

  5. Em Dê um nome para sua aplicação, insira um nome descritivo ou mantenha o nome padrão.

  6. Em Adicionar um URL de retorno, insira um caminho de redirecionamento para a aplicação após os usuários concluírem a autenticação.

  7. Escolha Criar sua aplicação. Você pode configurar as opções avançadas depois de criar o cliente de aplicação.

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.

  1. Abra a página de funções do console do Lambda.

  2. Escolha a opção Criar função.

  3. Selecione Criar do zero.

  4. No painel Informações básicas, em Nome da função, insira myPreTokenGenerationLambdaFunction.

  5. Em Runtime, selecione Node.js 22.

  6. Mantenha a arquitetura definida como x86_64.

  7. Escolha a opção Criar função.

  8. Na guia Código, em Origem do código, insira a amostra da função do Lambda indicada na seção Recursos adicionais desse padrão. Esta função do Lambda insere os atributos personalizados no token de ID e no token de acesso.

AWS DevOps, desenvolvedor de aplicativos

Personalize o fluxo de trabalho do grupo de usuários.

  1. Acesse o console do Amazon Cognito.

  2. Escolha User Pools (Grupos de usuários).

  3. Escolha o grupo de usuários que você criou anteriormente.

  4. No painel de navegação à esquerda, em Autenticação, escolha Extensões.

  5. Selecione Adicionar acionador do Lambda.

  6. Adicione ou edite um Acionador de geração de pré-token.

  7. Em Tipo de acionador, escolha Autenticação.

  8. Em Autenticação, selecione Acionador de geração de pré-token.

  9. Em Atribuir função do Lambda, escolha myPreTokenGenerationLambdaFunction.

  10. Selecione Adicionar acionador do Lambda.

  11. Escolha uma Versão do evento do acionador de Atributos básicos + personalização do token de acesso para identidades de usuário ou Atributos básicos + personalização do token de acesso para identidades de usuário e de máquinas. Essa configuração atualiza os parâmetros de solicitação que o Amazon Cognito envia à função para incluir campos para personalização do token de acesso.

Para obter mais informações, consulte Customizing user pool workflows with Lambda triggers na documentação do Amazon Cognito.

AWS DevOps, desenvolvedor de aplicativos
TarefaDescriptionHabilidades necessárias

Crie a aplicação do Node.js.

  1. No terminal, digite os seguintes 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 o package.json arquivo para incluir os scripts de TypeScript compilação:

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

Implemente a lógica de autenticação.

  1. Abra o arquivo index.ts.

  2. Cole a amostra do TypeScript fornecida na seção Recursos adicionais deste padrão.

  3. Salve e feche o arquivo index.ts.

nota

Você 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:

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

Nã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:

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

ProblemaSoluçã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

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