Autenticazione per siti web React
Il generatore di autenticazione per siti web React aggiunge l’autenticazione al tuo sito web React utilizzando Amazon Cognito.
Questo generatore configura l’infrastruttura CDK o Terraform per creare un Cognito User Pool e un Identity Pool associato, oltre a un’interfaccia utente ospitata per gestire i flussi di accesso degli utenti e la sua integrazione con il tuo sito web React.
Utilizzo
Sezione intitolata “Utilizzo”Aggiungere l’autenticazione al tuo sito web React
Sezione intitolata “Aggiungere l’autenticazione al tuo sito web React”Puoi aggiungere l’autenticazione al tuo sito web React in due modi:
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#authPuoi anche eseguire una prova per vedere quali file verrebbero modificati
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- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - ts#website#auth - Compila i parametri richiesti
- Clicca su
Generate
Opzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| project Obbligatorio | string | - | La directory radice del sito web. |
| cognitoDomain | string | - | Il prefisso del dominio Cognito da utilizzare. Se omesso, viene derivato un valore dallo scope npm e dal nome del progetto del sito web. |
| allowSignup | boolean | Se consentire l'auto-registrazione | |
| iac | inherit | cdk | terraform | inherit | Il provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale. |
| preferInstallDependencies | boolean | true | Se preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine. |
Output del generatore
Sezione intitolata “Output del generatore”Troverai le seguenti modifiche nel tuo sito web React:
Directorysrc
Directorycomponents
DirectoryCognitoAuth
- index.tsx Main authentication component
- main.tsx Updated to instrument the CognitoAuth component
Infrastruttura
Sezione intitolata “Infrastruttura”Poiché questo generatore fornisce infrastruttura come codice basata sul tuo iac scelto, creerà un progetto in packages/common che include i costrutti CDK o i moduli Terraform pertinenti.
Il progetto comune di infrastruttura come codice è strutturato come segue:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ Constructs for infrastructure specific to a project/generator
- …
Directorycore/ Generic constructs which are reused by constructs in
app- …
- index.ts Entry point exporting constructs from
app
- project.json Project build targets and configuration
Directorypackages/common/terraform
Directorysrc
Directoryapp/ Terraform modules for infrastructure specific to a project/generator
- …
Directorycore/ Generic modules which are reused by modules in
app- …
- project.json Project build targets and configuration
Troverai anche il seguente codice di infrastruttura generato in base al tuo iac selezionato:
Directorypackages/common/constructs/src
Directorycore
- user-identity.ts Construct which defines the user pool and identity pool
Directorypackages/common/terraform/src
Directorycore
Directoryuser-identity
- main.tf Module wrapper for the identity configuration
Directoryidentity
- identity.tf Core identity infrastructure including Cognito User Pool and Identity Pool
Directoryadd-callback-url
- add-callback-url.tf Module for adding callback URLs to existing user pool clients
Architettura
Sezione intitolata “Architettura”Questo generatore aggiunge un user pool Amazon Cognito (per l’accesso) e un identity pool (per federare gli utenti autenticati con credenziali IAM con ambito) all’architettura del sito web statico esistente:
Protezione dalle minacce
Sezione intitolata “Protezione dalle minacce”Il User Pool viene creato sul piano di funzionalità Plus di Cognito con la protezione dalle minacce impostata sulla modalità AUDIT per l’autenticazione standard. In modalità audit, Cognito assegna un livello di rischio a ogni accesso e registra la valutazione in CloudWatch senza bloccare gli utenti.
Una volta osservate le valutazioni del rischio per i tuoi utenti, puoi passare all’applicazione completa delle funzionalità per rispondere automaticamente alle attività rischiose (ad esempio richiedendo MFA o bloccando l’accesso):
Imposta standardThreatProtectionMode su StandardThreatProtectionMode.FULL_FUNCTION in packages/common/constructs/src/core/user-identity.ts.
Imposta advanced_security_mode su ENFORCED nel blocco user_pool_add_ons in packages/common/terraform/src/core/user-identity/identity/identity.tf.
Autenticazione a più fattori (MFA)
Sezione intitolata “Autenticazione a più fattori (MFA)”Per impostazione predefinita, gli utenti devono configurare l’MFA (un codice SMS o una password monouso basata sul tempo) prima di poter accedere. Puoi rendere l’MFA opzionale, disattivarla completamente o limitare i metodi di secondo fattore disponibili:
import { Mfa } from 'aws-cdk-lib/aws-cognito';
new UserIdentity(this, 'Identity', { mfa: Mfa.OPTIONAL, mfaSecondFactor: { sms: false, otp: true },});mfa accetta Mfa.OFF / Mfa.OPTIONAL / Mfa.REQUIRED. mfaSecondFactor.sms e mfaSecondFactor.otp abilitano o disabilitano ciascun metodo di secondo fattore in modo indipendente; non hanno effetto quando mfa è Mfa.OFF. Impostare mfa: Mfa.REQUIRED con entrambi i metodi disabilitati viene rifiutato al momento della sintesi, poiché nessuno potrebbe quindi completare l’accesso.
module "user_identity" { source = "../../common/terraform/src/core/user-identity"
mfa = "OPTIONAL" mfa_second_factor_sms = false mfa_second_factor_otp = true}mfa accetta "OFF" / "OPTIONAL" / "ON". mfa_second_factor_sms e mfa_second_factor_otp abilitano o disabilitano ciascun metodo di secondo fattore in modo indipendente; non hanno effetto quando mfa è "OFF".
Web Application Firewall (WAF)
Sezione intitolata “Web Application Firewall (WAF)”Per impostazione predefinita, il User Pool è associato a un Web ACL AWS WAFv2 utilizzando i gruppi di regole gestite AWSManagedRulesCommonRuleSet e AWSManagedRulesKnownBadInputsRuleSet. Puoi disabilitare questa opzione se desideri gestire il tuo Web ACL o se non ne hai bisogno:
new UserIdentity(this, 'Identity', { enableWaf: false });module "user_identity" { source = "../../common/terraform/src/core/user-identity"
enable_waf = false}Utilizzo dell’infrastruttura
Sezione intitolata “Utilizzo dell’infrastruttura”Dovrai aggiungere l’infrastruttura di identità utente al tuo stack, dichiarandola prima del sito web:
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'); }}Il costrutto UserIdentity aggiunge automaticamente la configurazione di runtime necessaria per garantire che il tuo sito web possa puntare al Cognito User Pool corretto per l’autenticazione.
Dovrai aggiungere il modulo di identità utente e assicurarti che il tuo sito web dipenda da esso:
# Deploy user identity first to add to runtime configmodule "user_identity" { source = "../../common/terraform/src/core/user-identity"}
# Deploy website after identity to include runtime configmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# Ensure identity is deployed first to add to runtime config depends_on = [module.user_identity]}Il modulo di identità utente aggiunge automaticamente la configurazione di runtime necessaria per garantire che il tuo sito web possa puntare al Cognito User Pool corretto per l’autenticazione.
Concedere l’accesso agli utenti autenticati
Sezione intitolata “Concedere l’accesso agli utenti autenticati”Per concedere agli utenti autenticati l’accesso per eseguire determinate azioni, come concedere le autorizzazioni per invocare un’API, puoi aggiungere dichiarazioni di policy IAM al ruolo autenticato dell’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', { integrations: MyApi.defaultIntegrations(this).build(), });
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}
# Add permissions for authenticated users to invoke Fast 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}/*" } ] })}