Ir al contenido

Autenticación de Sitio Web React

El generador de Autenticación de Sitio Web React añade autenticación a tu sitio web React usando Amazon Cognito.

Este generador configura la infraestructura CDK o Terraform para crear un Cognito User Pool y un Identity Pool asociado, así como una interfaz de usuario alojada para manejar los flujos de inicio de sesión de usuarios, y su integración con tu sitio web React.

Puedes añadir autenticación a tu sitio web React de dos maneras:

Terminal window
pnpm nx g @aws/nx-plugin:ts#website#auth
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:ts#website#auth --dry-run
ParámetroTipoPredeterminadoDescripción
project Requeridostring-El directorio raíz del sitio web.
cognitoDomain string-El prefijo del dominio de Cognito a utilizar. Si se omite, se deriva un valor del scope de npm y el nombre del proyecto del sitio web.
allowSignup booleanSi se permite el auto-registro
iac inherit | cdk | terraforminheritEl proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial.
preferInstallDependencies booleantrueSi se prefiere instalar las dependencias después de que se ejecute el generador. Establece en false para diferir la instalación cuando se ejecutan múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instala una vez al final.

Encontrarás los siguientes cambios en tu sitio web React:

  • Directoriosrc
    • Directoriocomponents
      • DirectorioCognitoAuth
        • index.tsx Main authentication component
    • main.tsx Updated to instrument the CognitoAuth component

Dado que este generador proporciona infraestructura como código basada en tu iac elegido, creará un proyecto en packages/common que incluye las construcciones CDK o módulos Terraform relevantes.

El proyecto común de infraestructura como código está estructurado de la siguiente manera:

  • Directoriopackages/common/constructs
    • Directoriosrc
      • Directorioapp/ Constructs for infrastructure specific to a project/generator
      • Directoriocore/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

También encontrarás el siguiente código de infraestructura generado según tu iac seleccionado:

  • Directoriopackages/common/constructs/src
    • Directoriocore
      • user-identity.ts Construct which defines the user pool and identity pool

Este generador añade un user pool de Amazon Cognito (para inicio de sesión) y un identity pool (para federar usuarios autenticados a credenciales IAM con alcance) a la arquitectura de sitio web estático existente:

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

El User Pool se crea en el plan de características Plus de Cognito con protección contra amenazas configurada en modo AUDIT para autenticación estándar. En modo auditoría, Cognito asigna un nivel de riesgo a cada inicio de sesión y registra la evaluación en CloudWatch sin bloquear a los usuarios.

Una vez que hayas observado las evaluaciones de riesgo para tus usuarios, puedes cambiar a la aplicación de función completa para responder automáticamente a actividades riesgosas (por ejemplo, requerir MFA o bloquear el inicio de sesión):

Establece standardThreatProtectionMode a StandardThreatProtectionMode.FULL_FUNCTION en packages/common/constructs/src/core/user-identity.ts.

Por defecto, los usuarios deben configurar MFA (un código SMS o una contraseña de un solo uso basada en tiempo) antes de poder iniciar sesión. Puedes hacer que MFA sea opcional, desactivarlo por completo o restringir qué métodos de segundo factor están disponibles:

import { Mfa } from 'aws-cdk-lib/aws-cognito';
new UserIdentity(this, 'Identity', {
mfa: Mfa.OPTIONAL,
mfaSecondFactor: { sms: false, otp: true },
});

mfa acepta Mfa.OFF / Mfa.OPTIONAL / Mfa.REQUIRED. mfaSecondFactor.sms y mfaSecondFactor.otp habilitan o deshabilitan cada método de segundo factor de forma independiente; no tienen efecto cuando mfa es Mfa.OFF. Establecer mfa: Mfa.REQUIRED con ambos métodos deshabilitados se rechaza en tiempo de síntesis, ya que nadie podría entonces completar el inicio de sesión.

Por defecto, el User Pool está asociado con una Web ACL de AWS WAFv2 usando los grupos de reglas administradas AWSManagedRulesCommonRuleSet y AWSManagedRulesKnownBadInputsRuleSet. Puedes deshabilitar esto si deseas administrar tu propia Web ACL o no requieres una:

new UserIdentity(this, 'Identity', { enableWaf: false });

Necesitarás añadir la infraestructura de identidad de usuario a tu stack, declarándola antes del sitio 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');
}
}

El construct UserIdentity añade automáticamente la Configuración de Tiempo de Ejecución necesaria para asegurar que tu sitio web pueda apuntar al Cognito User Pool correcto para la autenticación.

Para otorgar a los usuarios autenticados acceso para realizar ciertas acciones, como otorgar permisos para invocar una API, puedes añadir declaraciones de política IAM al rol autenticado del 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');
}
}