React Website Authentication
O gerador React Website Authentication adiciona autenticação ao seu website React usando Amazon Cognito.
Este gerador configura a infraestrutura CDK ou Terraform para criar um Cognito User Pool e um Identity Pool associado, bem como uma interface hospedada para gerenciar fluxos de login de usuários e sua integração com seu website React.
Adicionar Autenticação ao seu React Website
Seção intitulada “Adicionar Autenticação ao seu React Website”Você pode adicionar autenticação ao seu React website de duas maneiras:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - ts#website#auth - Preencha os parâmetros obrigatórios
- Clique em
Generate
pnpm nx g @aws/nx-plugin:ts#website#authyarn nx g @aws/nx-plugin:ts#website#authnpx nx g @aws/nx-plugin:ts#website#authbunx nx g @aws/nx-plugin:ts#website#authVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:ts#website#auth --dry-runyarn nx g @aws/nx-plugin:ts#website#auth --dry-runnpx nx g @aws/nx-plugin:ts#website#auth --dry-runbunx nx g @aws/nx-plugin:ts#website#auth --dry-run| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| project Obrigatório | string | - | O diretório raiz do website. |
| cognitoDomain | string | - | O prefixo do domínio Cognito a ser usado. Se omitido, um valor é derivado do escopo npm e do nome do projeto do website. |
| allowSignup | boolean | Se deve permitir auto-registro | |
| iac | inherit | cdk | terraform | inherit | O provedor IaC preferido. Por padrão, isso é herdado da sua seleção inicial. |
| preferInstallDependencies | boolean | true | Se deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final. |
Saída do Gerador
Seção intitulada “Saída do Gerador”Você encontrará as seguintes alterações em seu React website:
Directorysrc
Directorycomponents
DirectoryCognitoAuth
- index.tsx Componente de autenticação principal
- main.tsx Atualizado para instrumentar o componente CognitoAuth
Infraestrutura
Seção intitulada “Infraestrutura”Como este gerador fornece infraestrutura como código com base no iac escolhido, ele criará um projeto em packages/common que inclui os constructs CDK ou módulos Terraform relevantes.
O projeto comum de infraestrutura como código está estruturado da seguinte forma:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ Constructs para infraestrutura específica de um projeto/gerador
- …
Directorycore/ Constructs genéricos reutilizados pelos constructs em
app- …
- index.ts Ponto de entrada exportando os constructs de
app
- project.json Metas de build e configuração do projeto
Directorypackages/common/terraform
Directorysrc
Directoryapp/ Módulos Terraform para infraestrutura específica de um projeto/gerador
- …
Directorycore/ Módulos genéricos reutilizados pelos módulos em
app- …
- project.json Metas de build e configuração do projeto
Você também encontrará o seguinte código de infraestrutura gerado com base no iac selecionado:
Directorypackages/common/constructs/src
Directorycore
- user-identity.ts Construct que define o user pool e o identity pool
Directorypackages/common/terraform/src
Directorycore
Directoryuser-identity
- main.tf Wrapper de módulo para a configuração de identidade
Directoryidentity
- identity.tf Infraestrutura de identidade principal incluindo Cognito User Pool e Identity Pool
Directoryadd-callback-url
- add-callback-url.tf Módulo para adicionar URLs de callback a clientes de user pool existentes
Arquitetura
Seção intitulada “Arquitetura”Este gerador adiciona um Amazon Cognito user pool (para login) e um identity pool (para federar usuários autenticados a credenciais IAM com escopo) à arquitetura de website estático existente:
Proteção contra ameaças
Seção intitulada “Proteção contra ameaças”O User Pool é criado no plano de recursos Plus do Cognito com proteção contra ameaças definida para o modo AUDIT para autenticação padrão. No modo de auditoria, o Cognito atribui um nível de risco a cada login e registra a avaliação no CloudWatch sem bloquear usuários.
Uma vez que você tenha observado as avaliações de risco para seus usuários, você pode alternar para a aplicação de função completa para responder automaticamente a atividades arriscadas (por exemplo, exigindo MFA ou bloqueando o login):
Defina standardThreatProtectionMode como StandardThreatProtectionMode.FULL_FUNCTION em packages/common/constructs/src/core/user-identity.ts.
Defina advanced_security_mode como ENFORCED no bloco user_pool_add_ons em packages/common/terraform/src/core/user-identity/identity/identity.tf.
Web Application Firewall (WAF)
Seção intitulada “Web Application Firewall (WAF)”Por padrão, o User Pool é associado a um AWS WAFv2 Web ACL usando os grupos de regras gerenciadas AWSManagedRulesCommonRuleSet e AWSManagedRulesKnownBadInputsRuleSet. Você pode desabilitar isso se desejar gerenciar seu próprio Web ACL ou não precisar de um:
new UserIdentity(this, 'Identity', { enableWaf: false });module "user_identity" { source = "../../common/terraform/src/core/user-identity"
enable_waf = false}Uso da Infraestrutura
Seção intitulada “Uso da Infraestrutura”Você precisará adicionar a infraestrutura de identidade de usuário à sua stack, declarando-a antes do website:
import { Stack } from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyWebsite, UserIdentity } from ':my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string) { super(scope, id);
new UserIdentity(this, 'Identity');
new MyWebsite(this, 'MyWebsite'); }}O construct UserIdentity adiciona automaticamente a Configuração de Runtime necessária para garantir que seu website possa apontar para o Cognito User Pool correto para autenticação.
Você precisará adicionar o módulo de identidade de usuário e garantir que seu website dependa dele:
# Implanta a identidade primeiro para adicionar à configuração de runtimemodule "user_identity" { source = "../../common/terraform/src/core/user-identity"}
# Implanta o website após a identidade para incluir a configuração de runtimemodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# Garante que a identidade seja implantada primeiro para adicionar à configuração de runtime depends_on = [module.user_identity]}O módulo de identidade de usuário adiciona automaticamente a Configuração de Runtime necessária para garantir que seu website possa apontar para o Cognito User Pool correto para autenticação.
Concedendo Acesso a Usuários Autenticados
Seção intitulada “Concedendo Acesso a Usuários Autenticados”Para conceder aos usuários autenticados acesso para realizar certas ações, como conceder permissões para invocar uma API, você pode adicionar declarações de política IAM à função autenticada do identity pool:
import { Stack } from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyWebsite, UserIdentity, MyApi } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string) { super(scope, id);
const identity = new UserIdentity(this, 'Identity'); const api = new MyApi(this, 'MyApi');
api.grantInvokeAccess(identity.identityPool.authenticatedRole);
new MyWebsite(this, 'MyWebsite'); }}module "user_identity" { source = "../../common/terraform/src/core/user-identity"}
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
module "my_api" { source = "../../common/terraform/src/app/apis/my-api"
asset_bucket_name = module.asset_bucket.bucket_name}
# Adiciona permissões para usuários autenticados invocarem a APIresource "aws_iam_role_policy" "authenticated_fast_api_invoke" { name = "authenticated-user-invoke-my-api" role = module.user_identity.authenticated_role_name
policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "execute-api:Invoke" ] Resource = "${module.my_api.api_execution_arn}/*" } ] })}