Authentification de site web React
Le générateur d’authentification pour site web React ajoute une authentification à votre site React en utilisant Amazon Cognito.
Ce générateur configure l’infrastructure CDK ou Terraform pour créer un User Pool Cognito et un Identity Pool associé, ainsi qu’une interface hébergée pour gérer les flux de connexion utilisateur et son intégration avec votre site React.
Utilisation
Section intitulée « Utilisation »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 :
- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)
dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - ts#react-website#auth
- Remplissez les paramètres requis
- Cliquez sur
Generate
pnpm nx g @aws/nx-plugin:ts#react-website#auth
yarn nx g @aws/nx-plugin:ts#react-website#auth
npx nx g @aws/nx-plugin:ts#react-website#auth
bunx nx g @aws/nx-plugin:ts#react-website#auth
Vous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:ts#react-website#auth --dry-run
yarn nx g @aws/nx-plugin:ts#react-website#auth --dry-run
npx nx g @aws/nx-plugin:ts#react-website#auth --dry-run
bunx nx g @aws/nx-plugin:ts#react-website#auth --dry-run
Paramètre | Type | Par défaut | Description |
---|---|---|---|
project Requis | string | - | The root directory of the React website. |
cognitoDomain Requis | string | - | The cognito domain prefix to use |
allowSignup | boolean | Whether to allow self-signup | |
iacProvider | string | Inherit | The preferred IaC provider. By default this is inherited from your initial selection. |
Sortie du générateur
Section intitulée « Sortie du générateur »Vous trouverez les modifications suivantes dans votre site web React :
Répertoiresrc
Répertoirecomponents
RépertoireCognitoAuth
- index.tsx Composant principal d’authentification
- main.tsx Mis à jour pour intégrer le composant CognitoAuth
Infrastructure
Section intitulée « Infrastructure »Ce générateur fournit de l’infrastructure as code basée sur votre iacProvider
choisi. Il créera un projet dans packages/common
qui inclut les constructions CDK ou modules Terraform pertinents.
Le projet commun d’infrastructure as code est structuré comme suit :
Répertoirepackages/common/constructs
Répertoiresrc
Répertoireapp/ Constructions pour l’infrastructure spécifique à un projet/générateur
- …
Répertoirecore/ Constructions génériques réutilisées par celles dans
app
- …
- index.ts Point d’entrée exportant les constructions depuis
app
- project.json Cibles de build et configuration du projet
Répertoirepackages/common/terraform
Répertoiresrc
Répertoireapp/ Modules Terraform pour l’infrastructure spécifique à un projet/générateur
- …
Répertoirecore/ Modules génériques réutilisés par ceux dans
app
- …
- project.json Cibles de build et configuration du projet
Vous trouverez également le code d’infrastructure suivant généré en fonction du iacProvider
sélectionné :
Répertoirepackages/common/constructs/src
Répertoirecore
- user-identity.ts Construct définissant le user pool et l’identity pool
Répertoirepackages/common/terraform/src
Répertoirecore
Répertoireuser-identity
- main.tf Module wrapper pour la configuration d’identité
Répertoireidentity
- identity.tf Infrastructure d’identité principale incluant Cognito User Pool et Identity Pool
Répertoireadd-callback-url
- add-callback-url.tf Module pour ajouter des URLs de callback aux clients existants du user pool
Utilisation de l’infrastructure
Section intitulée « Utilisation de l’infrastructure »Vous devrez ajouter l’infrastructure d’identité utilisateur à votre stack, en la déclarant avant le site 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'); }}
Le construct UserIdentity
ajoute automatiquement la Configuration d’exécution nécessaire pour que votre site web puisse pointer vers le bon Cognito User Pool pour l’authentification.
Vous devrez ajouter le module d’identité utilisateur et vous assurer que votre site web en dépend :
# Déployer d'abord l'identité utilisateur pour l'ajouter à la config d'exécutionmodule "user_identity" { source = "../../common/terraform/src/core/user-identity"}
# Déployer le site web après l'identité pour inclure la config d'exécutionmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# S'assurer que l'identité est déployée en premier depends_on = [module.user_identity]}
Le module d’identité utilisateur ajoute automatiquement la Configuration d’exécution nécessaire pour que votre site web puisse 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 »Pour accorder aux utilisateurs authentifiés l’accès à certaines actions, comme l’autorisation d’appeler une API, vous pouvez ajouter des déclarations de politique IAM au rôle authentifié de l’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');
api.grantInvokeAccess(identity.identityPool.authenticatedRole);
new MyWebsite(this, 'MyWebsite'); }}
module "user_identity" { source = "../../common/terraform/src/core/user-identity"}
module "my_api" { source = "../../common/terraform/src/app/apis/my-api"}
# Ajouter des permissions pour les utilisateurs authentifiés d'appeler 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}/*" } ] })}