Salta ai contenuti

Autenticazione per Sito Web React

Il generatore React Website Authentication 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 il relativo 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:

Esegui questo generatore@aws/nx-plugin:ts#website#auth

pnpm nx g @aws/nx-plugin:ts#website#auth
Componi il tuo comando5

Obbligatorio

Opzioni del generatore5 opzioni
projectObbligatoriostring

La directory radice del sito web.

cognitoDomainstring

Il prefisso del dominio Cognito da utilizzare. Se omesso, viene derivato un valore dallo scope npm e dal nome del progetto del sito web.

allowSignupbooleanPredefinito: false

Se consentire l'auto-registrazione

iacenumPredefinito: inherit

Il provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale.

inheritcdkterraform
preferInstallDependenciesbooleanPredefinito: 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.

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 a credenziali IAM con ambito) all’architettura esistente del sito web statico:

Loading the diagram…

Il User Pool viene creato sul piano funzionalità Plus di Cognito con la protezione dalle minacce in modalità di applicazione solo audit per l’autenticazione standard. In modalità solo audit, Cognito assegna un livello di rischio a ogni accesso e registra la valutazione 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), quindi configurare la risposta per livello di rischio tramite l’autenticazione adattiva:

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 quali metodi di secondo fattore sono 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 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, StackProps } 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, props?: StackProps) {
super(scope, id, props);
new UserIdentity(this, 'Identity');
new MyWebsite(this, 'MyWebsite');
}
}

Il costrutto UserIdentity aggiunge automaticamente la Configurazione 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, StackProps } 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, props?: StackProps) {
super(scope, id, props);
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');
}
}