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.
Añadir Autenticación a tu Sitio Web React
Sección titulada «Añadir Autenticación a tu Sitio Web React»Puedes añadir autenticación a tu sitio web React de dos maneras:
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#authTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
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- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - ts#website#auth - Complete los parámetros requeridos
- Haga clic en
Generate
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| project Requerido | string | - | 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 | boolean | Si se permite el auto-registro | |
| iac | inherit | cdk | terraform | inherit | El proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial. |
| preferInstallDependencies | boolean | true | Si 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. |
Salida del Generador
Sección titulada «Salida del Generador»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
Infraestructura
Sección titulada «Infraestructura»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
Directoriopackages/common/terraform
Directoriosrc
Directorioapp/ Terraform modules for infrastructure specific to a project/generator
- …
Directoriocore/ Generic modules which are reused by modules in
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
Directoriopackages/common/terraform/src
Directoriocore
Directoriouser-identity
- main.tf Module wrapper for the identity configuration
Directorioidentity
- identity.tf Core identity infrastructure including Cognito User Pool and Identity Pool
Directorioadd-callback-url
- add-callback-url.tf Module for adding callback URLs to existing user pool clients
Arquitectura
Sección titulada «Arquitectura»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:
Protección contra amenazas
Sección titulada «Protección contra amenazas»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.
Establece advanced_security_mode a ENFORCED en el bloque user_pool_add_ons en packages/common/terraform/src/core/user-identity/identity/identity.tf.
Autenticación multifactor (MFA)
Sección titulada «Autenticación multifactor (MFA)»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.
module "user_identity" { source = "../../common/terraform/src/core/user-identity"
mfa = "OPTIONAL" mfa_second_factor_sms = false mfa_second_factor_otp = true}mfa acepta "OFF" / "OPTIONAL" / "ON". mfa_second_factor_sms y mfa_second_factor_otp habilitan o deshabilitan cada método de segundo factor de forma independiente; no tienen efecto cuando mfa es "OFF".
Web Application Firewall (WAF)
Sección titulada «Web Application Firewall (WAF)»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 });module "user_identity" { source = "../../common/terraform/src/core/user-identity"
enable_waf = false}Uso de Infraestructura
Sección titulada «Uso de Infraestructura»Necesitarás añadir la infraestructura de identidad de usuario a tu stack, declarándola antes del sitio 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'); }}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.
Necesitarás añadir el módulo de identidad de usuario, y asegurar que tu sitio web dependa de él:
# 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]}El módulo de identidad de usuario 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.
Otorgar Acceso a Usuarios Autenticados
Sección titulada «Otorgar Acceso a Usuarios Autenticados»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:
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}/*" } ] })}