Modelos de autorização para autenticação de API e SDK - Amazon Cognito

Modelos de autorização para autenticação de API e SDK

Ao iniciar o desenvolvimento da sua aplicação com a autenticação de grupos de usuários, você deve decidir qual modelo de autorização de API se adequa ao tipo da sua aplicação. Um modelo de autorização é um sistema para fornecer autorizações para fazer solicitações com os componentes de autenticação nas integrações de API e SDK dos grupos de usuários do Amazon Cognito. O Amazon Cognito tem três modelos de autorização: autorizado pelo IAM, público e autorizado por token.

Com solicitações autorizadas pelo IAM, a autorização provém de uma assinatura de um conjunto de credenciais do AWS IAM no cabeçalho Authorization de uma solicitação. Para aplicações do lado do servidor, essa prática protege as operações de autenticação com autorização do IAM. Com solicitações de autenticação públicas (não autenticadas), nenhuma autorização é necessária. Isso é adequado para aplicações do lado do cliente distribuídas aos usuários. Com operações autorizadas por token, normalmente implementadas em combinação com operações públicas, a autorização provém de um token de sessão ou de um token de acesso incluído no cabeçalho Authorization da solicitação. A autenticação do Amazon Cognito normalmente exige que você implemente duas ou mais operações de API em ordem, e as operações de API utilizadas dependem das características da sua aplicação. Clientes públicos, onde a aplicação é distribuída aos usuários, usam operações públicas, nas quais as solicitações de login não exigem autorização. As operações autorizadas por tokens mantêm a sessão dos usuários em aplicações públicas. Clientes do lado do servidor, onde a lógica da aplicação está hospedada em um sistema remoto, protegem as operações de autenticação com a autorização do IAM para solicitações de login. Os pares de operações de API a seguir e seus métodos de SDK correspondentes são mapeados para os modelos de autorização disponíveis.

Cada operação de autenticação pública tem alguma forma de equivalente do lado do servidor, por exemplo, UpdateUserAttributes e AdminUpdateUserAttributes. Enquanto as operações do lado do cliente são iniciadas pelo usuário e exigem confirmação, as operações do lado do servidor pressupõem que a alteração foi confirmada por um administrador do grupo de usuários e as alterações entram em vigor imediatamente. Nesse exemplo, o Amazon Cognito envia uma mensagem com um código de confirmação para o usuário, e o token de acesso do usuário autoriza uma solicitação VerifyUserAttribute que envia o código. A aplicação do lado do servidor pode definir imediatamente o valor de qualquer atributo, embora considerações especiais se apliquem à alteração do valor de endereços de e-mail e números de telefone quando usados para login.

Para comparar a autenticação de API e ver uma lista completa das operações de API e seus modelos de autorização, consulte Noções básicas sobre a autenticação de API, OIDC e páginas de login gerenciado.

Client-side (public) authentication

Veja a seguir uma sequência típica de solicitações em uma aplicação do lado do cliente.

  1. A operação pública InitiateAuth envia credenciais primárias, como nome de usuário e senha.

  2. A operação RespondToAuthChallenge autorizada por token envia um token de sessão da resposta InitiateAuth e a resposta a um desafio, por exemplo, MFA. A autorização do token de sessão indica solicitações que fazem parte de ciclos de autenticação ainda não concluídos.

  3. A operação ConfirmDevice autorizada por token envia um token de acesso e executa a operação de gravação, adicionando um dispositivo memorizado ao perfil do usuário. A autorização do token de acesso indica solicitações que são para operações de autoatendimento do usuário após a conclusão da autenticação.

Para obter mais informações, consulte Opções de autenticação do lado do cliente e Noções básicas sobre a autenticação de API, OIDC e páginas de login gerenciado.

Server-side authentication

Veja a seguir uma sequência típica de solicitações de uma operação do lado do servidor. Cada solicitação tem um cabeçalho de autorização do AWS Signature versão 4 assinado com as credenciais da máquina IAM emitidas para o servidor da aplicação.

  1. A operação AdminInitiateAuth envia credenciais primárias, como nome de usuário e senha.

  2. A operação AdminRespondToAuthChallenge envia a resposta a um desafio, por exemplo, MFA.

  3. A operação AdminUpdateDeviceStatus define como memorizada a chave do dispositivo da resposta de AdminInitiateAuth.

Para obter mais informações, consulte Opções de autenticação do lado do servidor e Noções básicas sobre a autenticação de API, OIDC e páginas de login gerenciado.

Um usuário faz a autenticação respondendo a desafios sucessivos até que ela falhe ou o Amazon Cognito emita tokens para o usuário. Você pode repetir essas etapas com o Amazon Cognito, em um processo que inclui desafios diferentes, para comportar qualquer fluxo de autenticação personalizado.

Opções de autenticação do lado do servidor

As aplicações Web e outras aplicações do lado do servidor implementam a autenticação em um servidor remoto que um cliente carrega em uma aplicação de exibição remota, como um navegador ou uma sessão SSH. As aplicações do lado do servidor geralmente têm as características a seguir.

  • Elas são criadas em uma aplicação instalada em um servidor em linguagens como Java, Ruby ou Node.js.

  • Elas se conectam a clientes da aplicação de grupos de usuários que podem ter um segredo do cliente, chamados de clientes confidenciais.

  • Elas têm acesso às credenciais da AWS.

  • Elas invocam o login gerenciado para autenticação ou usam operações autorizadas pelo IAM na API de grupos de usuários com um SDK da AWS.

  • Elas atendem clientes internos e podem atender clientes públicos.

As operações do lado do servidor com a API de grupos de usuários podem usar senhas, senhas de uso único ou chaves de acesso como o principal fator de login. Para aplicações no lado do servidor, a autenticação do grupo de usuários é semelhante à das aplicações no lado do cliente, exceto pelo seguinte:

  • A aplicação do lado do servidor faz uma solicitação de API AdminInitiateAuth. Essa operação exige credenciais da AWS com permissões que incluam cognito-idp:AdminInitiateAuth e cognito-idp:AdminRespondToAuthChallenge. A operação retorna o desafio exigido ou o resultado da autenticação.

  • Quando a aplicação recebe um desafio, ela faz uma solicitação de API AdminRespondToAuthChallenge. A operação de API AdminRespondToAuthChallenge também requer credenciais da AWS.

Para obter mais informações sobre como assinar solicitações da API do Amazon Cognito com credenciais da AWS, consulte Signature Version 4 signing process (Processo de assinatura do Signature versão 4) na Referência geral da AWS.

Na resposta AdminInitiateAuth ChallengeParameters, o atributo USER_ID_FOR_SRP, se estiver presente, incluirá o nome do usuário real, não um alias (como o endereço de e-mail ou o número de telefone). Na chamada para AdminRespondToAuthChallenge, nas ChallengeResponses, é necessário transmitir esse nome de usuário no parâmetro USERNAME.

nota

Como as implementações de administração de backend usam o fluxo de autenticação de administração, o fluxo não é compatível com dispositivos memorizados. Quando você ativa o rastreamento de dispositivo, a autenticação de administração é executada com êxito, mas qualquer chamada para atualizar o token de acesso falha.

Opções de autenticação do lado do cliente

Aplicativos móveis e outros tipos de aplicações do lado do cliente são instalados nos dispositivos dos usuários e executam a lógica de autenticação e interface do usuário localmente. Eles geralmente têm as características a seguir.

  • Eles são desenvolvidos em linguagens como React Native, Flutter e Swift e implantados nos dispositivos do usuário.

  • Eles se conectam a clientes da aplicação de grupos de usuários que não têm um segredo do cliente, chamados de clientes públicos.

  • Eles não têm acesso às credenciais AWS que autorizariam solicitações de API autorizadas pelo IAM.

  • Elas invocam o login gerenciado para autenticação ou usam operações públicas e autorizadas por token na API de grupos de usuários com um SDK da AWS.

  • Eles atendem clientes públicos e permitem que qualquer pessoa se cadastre e faça login.

As operações do lado do cliente com a API de grupos de usuários podem usar senhas, senhas de uso único ou chaves de acesso como o principal fator de login. O processo a seguir funciona para aplicações do lado do cliente do usuário que você cria com o AWS Amplify, o com AWS SDKs.

  1. O usuário insere suas respectivas credenciais no aplicativo.

  2. A aplicação chama a operação InitiateAuth com o nome de usuário e os detalhes da Secure Remote Password (SRP).

    Essa operação da API retorna os parâmetros de autenticação.

    nota

    A aplicação gera detalhes do SRP com os recursos SRP do Amazon Cognito incorporados aos AWS SDKs.

  3. O aplicativo chama a operação RespondToAuthChallenge. Se a chamada for bem-sucedida, o Amazon Cognito retornará os tokens do usuário e o fluxo de autenticação será concluído.

    Se o Amazon Cognito exigir outro desafio, a chamada para RespondToAuthChallenge não retornará tokens. Em vez disso, a chamada retornará uma sessão.

  4. Se RespondToAuthChallenge retornar uma sessão, o aplicativo chamará RespondToAuthChallenge novamente, dessa vez com a sessão e a resposta ao desafio (por exemplo, código de MFA).

Noções básicas sobre a autenticação de API, OIDC e páginas de login gerenciado

Os grupos de usuários do Amazon Cognito são uma combinação de várias tecnologias de autenticação. Eles atuam como partes confiáveis para provedores de identidades (IdPs) externos. Eles são IdPs para aplicações que implementam autenticação com SDKs do OpenID Connect (OIDC). Fornecem autenticação como emissores de tokens web JSON (JWTs), semelhante à autenticação OIDC, mas em métodos de API que fazem parte dos SDKs da AWS. Também podem servir como pontos de entrada seguros para suas aplicações.

Quando quiser se inscrever, fazer login e gerenciar usuários no grupo de usuários, você terá duas opções.

  1. As páginas de login gerenciado e a IU hospedada clássica incluem os endpoints interativos de login gerenciado e os endpoints de federação que lidam com funções de IdP e de partes confiáveis. Eles formam um pacote de páginas da web públicas que o Amazon Cognito ativa quando você seleciona um domínio para o grupo de usuários. Para começar rapidamente com os recursos de autenticação e autorização dos grupos de usuários do Amazon Cognito, incluindo páginas para cadastro, login, gerenciamento de senhas e autenticação multifator (MFA), use a interface de usuário integrada do login gerenciado.

    Os outros endpoints de grupo de usuários facilitam a autenticação com provedores de identidades (IdPs) de terceiros. Os serviços que eles realizam incluem o seguinte:

    1. Endpoints de retorno de chamada do provedor de serviços para solicitações autenticadas de seus IdPs, como saml2/idpresponse e oauth2/idpresponse. Quando o Amazon Cognito é um provedor de serviços (SP) intermediário entre sua aplicação e o IdP, os endpoints de retorno de chamada representam o serviço.

    2. Endpoints que fornecem informações sobre seu ambiente, como oauth2/userInfo/.well-known/jwks.json. Sua aplicação usa esses endpoints ao verificar tokens ou recupera dados do perfil do usuário com bibliotecas de desenvolvedor do OIDC e OAuth 2.0.

  2. A API de grupos de usuários do Amazon Cognito é um conjunto de ferramentas para sua aplicação web ou aplicativo móvel autenticar usuários após coletar informações de login em seu próprio frontend personalizado. A autenticação da API de grupos de usuários produz os tokens web JSON a seguir.

    1. Um token de identidade com declarações de atributos verificáveis do usuário.

    2. Um token de acesso que autoriza o usuário a criar solicitações de API autorizadas por token para um endpoint de serviço da AWS.

      nota

      Por padrão, os tokens de acesso da autenticação da API de grupos de usuários contêm apenas o escopo aws.cognito.signin.user.admin. Para gerar um token de acesso com escopos adicionais, por exemplo, para autorizar uma solicitação para uma API de terceiros, solicite os escopos durante a autenticação por meio dos endpoints do grupo de usuários ou adicione escopos personalizados em um Acionador do Lambda antes da geração do token. A personalização do token de acesso adiciona custos à sua fatura da AWS.

    3. Um token de atualização que autoriza solicitações de novos tokens de ID e acesso e atualiza a identidade do usuário e as propriedades de controle de acesso.

Você pode vincular um usuário federado, que normalmente faria login por meio dos endpoints de grupos de usuários, a um usuário cujo perfil seja local para sua lista de usuários. Um usuário local existe exclusivamente em seu diretório de grupo de usuários sem federação por meio de um IdP externo. Se você vincular a identidade federada dele a um usuário local em uma solicitação de API AdminLinkProviderForUser, ele poderá fazer login com a API de grupos de usuários. Para obter mais informações, consulte Vincular usuários federados a um perfil de usuário existente.

A API de grupos de usuários do Amazon Cognito tem duplo propósito.

  1. Ela cria e configura os recursos de grupos de usuários do Amazon Cognito. Por exemplo, você pode criar grupos de usuários, adicionar acionadores do AWS Lambda e configurar o domínio do grupo de usuários que hospeda as páginas de login gerenciado.

  2. Ela realiza operações de cadastro, login e outras operações para usuários locais e vinculados.

Exemplo de cenário com a API de grupos de usuários do Amazon Cognito
  1. O usuário seleciona o botão “Criar uma conta” que você criou na aplicação. Ele inserem um endereço de e-mail e uma senha.

  2. A aplicação envia uma solicitação da API SignUp e cria um usuário no grupo de usuários.

  3. A aplicação solicita que o usuário forneça um código de confirmação enviado por e-mail. O usuário insere o código que recebeu em uma mensagem de e-mail.

  4. A aplicação envia uma solicitação da API ConfirmSignUp com o código de confirmação do usuário.

  5. A aplicação solicita que o usuário informe o nome de usuário e a senha, e ele insere essas informações.

  6. A aplicação envia uma solicitação da API InitiateAuth e armazena um token de ID, token de acesso e token de atualização. A aplicação chama as bibliotecas do OIDC para gerenciar os tokens do usuário e manter uma sessão persistente para esse usuário.

Na API de grupos de usuários do Amazon Cognito, você não pode conectar usuários que se federam por meio de um IdP. É necessário autenticar esses usuários por meio dos endpoints de grupo de usuários. Para ter mais informações sobre os endpoints do grupo de usuários que incluem login gerenciado, consulte Referência de login gerenciado e endpoints do grupo de usuários.

Os usuários federados podem começar no login gerenciado e selecionar o IdP deles ou você pode ignorar o login gerenciado e enviar os usuários diretamente ao seu IdP para fazer login. Quando a solicitação de API para Autorizar endpoint inclui um parâmetro de IdP, o Amazon Cognito redireciona silenciosamente o usuário para a página de login do IdP.

Exemplo de cenário com páginas de login gerenciado
  1. O usuário seleciona o botão “Criar uma conta” que você criou na aplicação.

  2. O login gerenciado apresenta ao usuário uma lista dos provedores de identidades social nos quais você registrou as credenciais de desenvolvedor. O usuário escolhe a Apple.

  3. A aplicação inicia uma solicitação para Autorizar endpoint com o nome do provedor SignInWithApple.

  4. O navegador do usuário abre a página de autenticação da Apple. O usuário faz login e opta por autorizar que o Amazon Cognito leia as informações do perfil dele.

  5. O Amazon Cognito confirma o token de acesso da Apple e consulta o perfil Apple do usuário.

  6. O usuário apresenta um código de autorização do Amazon Cognito para a aplicação.

  7. A biblioteca OIDC na aplicação troca o código de autorização com o Endpoint de token e armazena um token de ID, token de acesso e token de atualização emitidos pelo grupo de usuários. A aplicação usa bibliotecas do OIDC para gerenciar os tokens do usuário e manter uma sessão persistente para esse usuário.

A API de grupo de usuários e as páginas de login gerenciado são compatíveis com uma variedade de cenários descritos neste guia. As seções a seguir examinam como a API de grupos de usuários se divide ainda mais em classes que atendem aos seus requisitos de inscrição, login e gerenciamento de recursos.

Lista de operações de API agrupadas por modelo de autorização

A API de grupos de usuários do Amazon Cognito, tanto uma interface de gerenciamento de recursos quanto uma interface de autenticação e autorização voltada para o usuário, combina os modelos de autorização a seguir nas respectivas operações. Dependendo da operação da API, talvez seja necessário fornecer autorização com credenciais do IAM, um token de acesso, um token de sessão, um segredo do cliente ou uma combinação deles. Para muitas operações de autenticação e autorização de usuários, você pode escolher entre versões autenticadas e não autenticadas da solicitação. Operações não autenticadas são a prática recomendada de segurança para aplicações que você distribui para os usuários, como aplicações móveis; não é necessário incluir nenhum segredo no código.

Você pode atribuir permissões nas políticas do IAM somente para Operações de gerenciamento autorizadas pelo IAM e Operações de usuário autorizadas pelo IAM.

As operações de gerenciamento autorizadas pelo IAM permitem modificar e exibir a configuração do grupo de usuários e do cliente da aplicação, da mesma forma que você faria no Console de gerenciamento da AWS.

Por exemplo, para modificar o grupo de usuários em uma solicitação da API UpdateUserPool, você deve apresentar credenciais da AWS e permissões do IAM para atualizar o recurso.

Para autorizar essas solicitações na AWS Command Line Interface (AWS CLI) ou em um AWS SDK, configure o ambiente com variáveis de ambiente ou configuração de cliente que adicione credenciais do IAM à solicitação. Para ter mais informações, consulte Acessar a AWS usando suas credenciais da AWS na Referência geral da AWS. Você também pode enviar solicitações diretamente aos endpoints de serviço da API de grupos de usuários do Amazon Cognito. Você deve autorizar ou assinar essas solicitações com credenciais da AWS que incorpora no cabeçalho da solicitação. Para ter mais informações, consulte Assinar solicitações de API da AWS.

As operações de usuário autorizadas pelo IAM permitem o cadastro, o login, o gerenciamento de credenciais, a modificação e a exibição dos usuários.

Por exemplo, você pode ter um nível de aplicação do lado do servidor que oferece suporte a um front-end da Web. A aplicação do lado do servidor é um cliente confidencial do OAuth no qual você confia, com acesso privilegiado aos seus recursos do Amazon Cognito. Para registrar um usuário na aplicação, o servidor pode incluir credenciais da AWS em uma solicitação da API AdminCreateUser. Para obter mais informações sobre os tipos de clientes do OAuth, consulte Client Types (Tipos de cliente) na Estrutura de autorização do OAuth 2.0.

Para autorizar essas solicitações na AWS CLI ou em um AWS SDK, configure o ambiente da aplicação do lado do servidor com variáveis de ambiente ou configuração do cliente que adiciona credenciais do IAM à solicitação. Para ter mais informações, consulte Acessar a AWS usando suas credenciais da AWS na Referência geral da AWS. Você também pode enviar solicitações diretamente aos endpoints de serviço da API de grupos de usuários do Amazon Cognito. Você deve autorizar ou assinar essas solicitações com credenciais da AWS que incorpora no cabeçalho da solicitação. Para ter mais informações, consulte Assinar solicitações de API da AWS.

Se o cliente da aplicação tiver um segredo de cliente, você deverá fornecer suas credenciais do IAM e, dependendo da operação, o parâmetro SecretHash ou o valor SECRET_HASH em AuthParameters. Para obter mais informações, consulte Computar valores de hash de segredo.

Operações de usuário não autenticadas para se inscrever, fazer login e iniciar redefinições de senha para os usuários. Use operações de API não autenticadas ou públicas quando quiser que qualquer pessoa na internet se inscreva e faça login na aplicação.

Por exemplo, para registrar um usuário na aplicação, você pode distribuir um cliente público do OAuth que não fornece nenhum acesso privilegiado aos segredos. É possível registrar esse usuário com a operação de API não autenticada SignUp.

Para enviar essas solicitações em um cliente público que você desenvolveu com um AWS SDK, você não precisa configurar nenhuma credencial. Você também pode enviar solicitações diretamente aos endpoints de serviço da API de grupos de usuários do Amazon Cognito sem autorização adicional.

Se o cliente da aplicação tiver um segredo de cliente, você deverá fornecer, dependendo da operação, o parâmetro SecretHash ou o valor SECRET_HASH em AuthParameters. Para obter mais informações, consulte Computar valores de hash de segredo.

As operações de usuário autorizadas por token terminam a sessão, gerenciam as credenciais, modificam e visualizam os usuários após eles fazerem login ou iniciarem o processo de login. Use operações de API autorizadas por token quando não quiser distribuir segredos na aplicação e quiser autorizar solicitações com as credenciais do seu próprio usuário. Se o usuário tiver concluído o login, você deverá autorizar a solicitação de API autorizada por token com um token de acesso. Se o usuário estiver no meio de um processo de login, você deverá autorizar a solicitação de API autorizada por token com um token de sessão que o Amazon Cognito retornou em resposta à solicitação anterior.

Por exemplo, em um cliente público, talvez você queira atualizar o perfil de um usuário de uma forma que restrinja o acesso de gravação somente ao próprio perfil do usuário. Para fazer essa atualização, o cliente pode incluir o token de acesso do usuário em uma solicitação da API UpdateUserAttributes.

Para enviar essas solicitações em um cliente público que você desenvolveu com um AWS SDK, você não precisa configurar nenhuma credencial. Inclua um parâmetro AccessToken ou Session na solicitação. Você também pode enviar solicitações diretamente aos endpoints de serviço da API de grupos de usuários do Amazon Cognito. Para autorizar uma solicitação para um endpoint de serviço, inclua o token de acesso ou sessão no corpo POST da solicitação.

Para assinar uma solicitação de API para uma operação autorizada por token, inclua o token de acesso como cabeçalho Authorization na solicitação, no formato Bearer <Base64-encoded access token>.

¹ RevokeToken e GetTokensFromRefreshToken usam tokens de atualização como parâmetro de autorização. O token de atualização serve como token de autorização e como recurso de destino.