Salta ai contenuti

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.

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:

Terminal window
pnpm nx g @aws/nx-plugin:ts#website#auth
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
Terminal window
pnpm nx g @aws/nx-plugin:ts#website#auth --dry-run
ParametroTipoPredefinitoDescrizione
project Obbligatoriostring-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 booleanSe consentire l'auto-registrazione
iac inherit | cdk | terraforminheritIl provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale.
preferInstallDependencies booleantrueSe 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.

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

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

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

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:

Web BrowserWAFCognito(User + Identity Pool)Scoped IAMCredentialsAuthenticatedAWS Resources Sign in IAM/Cognito

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.

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.

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 });

Dovrai aggiungere l’infrastruttura di identità utente al tuo stack, dichiarandola prima del sito web:

packages/infra/src/stacks/application-stack.ts
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.

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:

packages/infra/src/stacks/application-stack.ts
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');
}
}