Aller au contenu

Authentification de site Web React

Le générateur d’authentification de site Web React ajoute l’authentification à votre site Web React en utilisant Amazon Cognito.

Ce générateur configure l’infrastructure CDK ou Terraform pour créer un Cognito User Pool et un Identity Pool associé, ainsi qu’une interface utilisateur hébergée pour gérer les flux de connexion utilisateur et son intégration avec votre site Web React.

Ajouter l’authentification à votre site Web React

Section intitulée « Ajouter l’authentification à votre site Web React »

Vous pouvez ajouter l’authentification à votre site Web React de deux manières :

Terminal window
pnpm nx g @aws/nx-plugin:ts#website#auth
Vous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
Terminal window
pnpm nx g @aws/nx-plugin:ts#website#auth --dry-run
ParamètreTypePar défautDescription
project Requisstring-Le répertoire racine du site web.
cognitoDomain string-Le préfixe de domaine Cognito à utiliser. Si omis, une valeur est dérivée du scope npm et du nom du projet de site web.
allowSignup booleanAutoriser ou non l'auto-inscription
iac inherit | cdk | terraforminheritLe fournisseur IaC préféré. Par défaut, celui-ci est hérité de votre sélection initiale.
preferInstallDependencies booleantrueIndique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir sur false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.

Vous trouverez les modifications suivantes dans votre site Web React :

  • Répertoiresrc
    • Répertoirecomponents
      • RépertoireCognitoAuth
        • index.tsx Main authentication component
    • main.tsx Updated to instrument the CognitoAuth component

Étant donné que ce générateur fournit de l’infrastructure en tant que code basée sur votre iac choisi, il créera un projet dans packages/common qui inclut les constructs CDK ou modules Terraform pertinents.

Le projet d’infrastructure en tant que code commun est structuré comme suit :

  • Répertoirepackages/common/constructs
    • Répertoiresrc
      • Répertoireapp/ Constructs pour l’infrastructure spécifique à un projet/générateur
      • Répertoirecore/ Constructs génériques qui sont réutilisés par les constructs dans app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

Vous trouverez également le code d’infrastructure suivant généré en fonction de votre iac sélectionné :

  • Répertoirepackages/common/constructs/src
    • Répertoirecore
      • user-identity.ts Construct which defines the user pool and identity pool

Ce générateur ajoute un pool d’utilisateurs Amazon Cognito (pour la connexion) et un pool d’identités (pour fédérer les utilisateurs connectés aux informations d’identification IAM délimitées) à l’architecture de site Web statique existante :

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

Le User Pool est créé sur le plan de fonctionnalités Plus de Cognito avec la protection contre les menaces définie en mode AUDIT pour l’authentification standard. En mode audit, Cognito attribue un niveau de risque à chaque connexion et enregistre l’évaluation dans CloudWatch sans bloquer les utilisateurs.

Une fois que vous avez observé les évaluations de risque pour vos utilisateurs, vous pouvez passer à l’application complète pour répondre automatiquement aux activités à risque (par exemple, exiger l’authentification multifacteur ou bloquer la connexion) :

Définissez standardThreatProtectionMode sur StandardThreatProtectionMode.FULL_FUNCTION dans packages/common/constructs/src/core/user-identity.ts.

Par défaut, les utilisateurs doivent configurer l’authentification multifacteur (un code SMS ou un mot de passe à usage unique basé sur le temps) avant de pouvoir se connecter. Vous pouvez rendre l’authentification multifacteur facultative, la désactiver entièrement ou restreindre les méthodes de second facteur disponibles :

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

mfa accepte Mfa.OFF / Mfa.OPTIONAL / Mfa.REQUIRED. mfaSecondFactor.sms et mfaSecondFactor.otp activent ou désactivent chaque méthode de second facteur indépendamment ; ils n’ont aucun effet lorsque mfa est Mfa.OFF. Définir mfa: Mfa.REQUIRED avec les deux méthodes désactivées est rejeté au moment de la synthèse, car personne ne pourrait alors terminer la connexion.

Par défaut, le User Pool est associé à un Web ACL AWS WAFv2 utilisant les groupes de règles gérées AWSManagedRulesCommonRuleSet et AWSManagedRulesKnownBadInputsRuleSet. Vous pouvez désactiver cela si vous souhaitez gérer votre propre Web ACL ou si vous n’en avez pas besoin :

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

Vous devrez ajouter l’infrastructure d’identité utilisateur à votre stack, en la déclarant avant le site 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');
}
}

Le construct UserIdentity ajoute automatiquement la Configuration d’exécution nécessaire pour garantir que votre site Web peut pointer vers le bon Cognito User Pool pour l’authentification.

Accorder l’accès aux utilisateurs authentifiés

Section intitulée « Accorder l’accès aux utilisateurs authentifiés »

Afin d’accorder aux utilisateurs authentifiés l’accès pour effectuer certaines actions, comme accorder des autorisations pour invoquer une API, vous pouvez ajouter des instructions de politique IAM au rôle authentifié du pool d’identités :

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