Categorie > Infrastructuur

Infrastructure as Code - AWS Cognito User Pool

geschreven door Wilco van Dijk

Bron: Mariia Shalabaieva


In dit artikel laat ik zien hoe je met AWS Cognito een user pool kunt opzetten, waarbij gebruikers moeten inloggen met een geverifieerd e-mail adres, wachtwoord en een extra beveiligingsniveau via een authenticator app. Voor het daadwerkelijk aanmaken van de resources gebruik ik een CloudFormation script, zodat we het proces kunnen automatiseren.

Vereisten

Voordat je aan de slag kunt gaan, zijn er enkele vereisten.

  • Je hebt een AWS account nodig. Als je nog geen account hebt kun je die hier aanmaken.

  • Basiskennis van Cloudformation-sjablonen. Heb je nog niet eerder iets gedaan met Cloudformation lees dan eerst dit artikel.

Wat is AWS Cognito?

AWS Cognito is een dienst waarmee je gebruikers kunt beheren en hen veilig kunt laten inloggen op je web- en mobiele apps. Het bewaart gebruikersgegevens, controleert hun identiteit en geeft hen de juiste toegangsrechten. Je kunt gebruikers authenticeren via verschillende bronnen, zoals de interne gebruikersdatabase van Cognito, je bedrijfsgebruikersdirectory en externe providers zoals Google en Facebook.

Kortom, AWS Cognito biedt een complete en schaalbare oplossing voor gebruikersauthenticatie en -beheer, zodat je je kunt concentreren op het bouwen van je applicatie zonder je zorgen te maken over de beveiliging van gebruikersgegevens.

AWS Cognito bestaat uit twee hoofdcomponenten: de user pool en de user pool client. Laten we ze beide nader bekijken.

User Pool

Een user pool is een directory waarin gebruikersaccounts worden opgeslagen. Het biedt functionaliteit voor:

  • Registratie en inloggen: Gebruikers kunnen zich registreren (aanmelden) en inloggen op je applicatie.

  • Gebruikersbeheer: Je kunt gebruikersprofielen beheren, inclusief attributen zoals e-mail, telefoonnummer, en andere aangepaste attributen.

  • Verificatie: Gebruikers moeten hun identiteit verifiëren, bijvoorbeeld via een e-mailadres of SMS-code. Multi-factor authenticatie (MFA) kan ook worden ingeschakeld.

  • Beveiliging: AWS Cognito zorgt voor veilige opslag en versleuteling van gebruikersgegevens en voldoet aan belangrijke compliance-vereisten.

Het aanmaken van een Cognito User Pool kan op twee manieren: handmatig via de Management Console of geautomatiseerd via een Cloudformation script. De laatste optie zullen we in dit artikel bespreken.

Met het volgende script maak je een Cognito User Pool aan:

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Cognito Userpool'

Parameters:
  UserPoolName:
    Type: String
    Description: The name of the Userpool
  UserPoolClientName:
    Type: String
    Description: The name of the Userpool client
  ReplyToEmailAddress:
    Type: String

Resources:
  UserPool:
    Type: AWS::Cognito::UserPool
    DeletionPolicy: Retain
    Properties:
      UsernameAttributes:
        - email
      UsernameConfiguration: 
        CaseSensitive: false
      Policies:
        PasswordPolicy:
         MinimumLength: 8
         RequireLowercase: true
         RequireNumbers: true
         RequireSymbols: true
         RequireUppercase: true
         TemporaryPasswordValidityDays: 7
      MfaConfiguration: 'OPTIONAL'
      EnabledMfas: 
        - SOFTWARE_TOKEN_MFA
      AccountRecoverySetting:
        RecoveryMechanisms:
          - Name: verified_email
            Priority: 1
      AdminCreateUserConfig:
        AllowAdminCreateUserOnly: false
      AutoVerifiedAttributes:
        - email
      UserPoolName: !Ref UserPoolName
      DeletionProtection: ACTIVE
      UserAttributeUpdateSettings:
        AttributesRequireVerificationBeforeUpdate:
          - email 
      Schema:
        - Name: email
          AttributeDataType: String
          Mutable: false
          Required: true
      EmailConfiguration:
        EmailSendingAccount: COGNITO_DEFAULT
        ReplyToEmailAddress: !Ref ReplyToEmailAddress

Hier is een uitleg van de eigenschappen die worden gebruikt in de AWS::Cognito::UserPool resource:

  • UsernameAttributes Specificeert welke gebruikersattributen kunnen worden gebruikt als de gebruikersnaam wanneer gebruikers zich aanmelden of inloggen bij de user pool. Deze eigenschap stelt ons in staat om de attributen te definiëren die gebruikers uniek identificeren binnen de user pool. De geldige waarden zijn e-mail en telefoonnummer.

  • UsernameConfiguration Specificeert de gevoeligheid voor hoofdlettergebruik bij de gebruikersnaam voor de geselecteerde inlogoptie. Voor de meeste gevallen is het een goede praktijk om de gevoeligheid voor hoofdlettergebruik op False (hoofdletterongevoelig) in te stellen.

  • PasswordPolicy Hiermee kunnen we de wachtwoordbeleid-instellingen voor gebruikerswachtwoorden binnen de user pool configureren. Deze instellingen definiëren de vereisten en beperkingen voor wachtwoorden die door gebruikers worden gebruikt bij het aanmelden of wijzigen van hun wachtwoorden.

    • MinimumLength Een gehele waarde die de minimale lengte aangeeft die vereist is voor gebruikerswachtwoorden.

    • RequireUppercase Een booleaanse waarde die aangeeft of gebruikerswachtwoorden minimaal één hoofdletter moeten bevatten.

    • RequireLowercase Een booleaanse waarde die aangeeft of gebruikerswachtwoorden minimaal één kleine letter moeten bevatten.

    • RequireNumbers Een booleaanse waarde die aangeeft of gebruikerswachtwoorden minimaal één numeriek teken moeten bevatten.

    • RequireSymbols Een booleaanse waarde die aangeeft of gebruikerswachtwoorden minimaal één speciaal teken of symbool moeten bevatten.

    • TemporaryPasswordValidityDays Een gehele waarde die het aantal dagen specificeert dat een tijdelijk wachtwoord geldig is voordat de gebruiker dit moet wijzigen.

  • MfaConfiguration Hiermee kunnen we de instellingen voor Multi-Factor Authenticatie (MFA) voor de user pool configureren.

    • OFF MFA is uitgeschakeld voor de user pool. Gebruikers hoeven MFA niet in te stellen of te gebruiken tijdens het inloggen.

    • ON MFA is ingeschakeld voor de user pool. Gebruikers moeten MFA configureren tijdens de registratie en deze gebruiken tijdens het inloggen.

    • OPTIONAL MFA is optioneel voor de user pool. Gebruikers kunnen ervoor kiezen om MFA te configureren tijdens de registratie, maar als ze dit doen, moeten ze het gebruiken tijdens het inloggen.

  • AccountRecoverySetting Hiermee kunnen we de instellingen voor accountherstel voor de user pool configureren. Deze instellingen bepalen hoe gebruikers toegang tot hun accounts kunnen herstellen.

  • RecoveryMechanisms Een array van herstelmechanismen die gebruikers kunnen gebruiken om hun accounts te herstellen. Elk herstelmechanisme specificeert hoe gebruikers hun identiteit kunnen verifiëren tijdens het accountherstelproces.

    • Name De naam van het herstelmechanisme. Dit kan een van de volgende waarden zijn:

      • verified_email Gebruikers ontvangen een verificatiecode via e-mail.

      • verified_phone_number Gebruikers ontvangen een verificatiecode via SMS naar hun telefoonnummer.

      • admin_only Accountherstel is alleen beschikbaar via een beheerder.

    • Priority Een gehele waarde die de prioriteit van het herstelmechanisme aangeeft. Lagere waarden geven een hogere prioriteit aan.

  • AutoVerifiedAttributes Attributen die automatisch worden geverifieerd bij de registratie van een gebruiker. Mogelijke waarden zijn e-mail en telefoonnummer.

  • AdminCreateUserConfig Hiermee kunnen we instellingen configureren die verband houden met het aanmaken van de gebruiker in de user pool. Deze instellingen bepalen wie gebruikersaccounts kan aanmaken en onder welke voorwaarden.

    • AllowAdminCreateUserOnly Wanneer ingesteld op False, kunnen zowel beheerders als gebruikers gebruikersaccounts aanmaken.

    • UnusedAccountValidityDays Een gehele waarde die het aantal dagen specificeert dat een ongebruikt account geldig blijft. Als een gebruikersaccount binnen deze periode niet wordt gebruikt, wordt het als verlopen beschouwd.

    • InviteMessageTemplate De berichtsjabloon die wordt gebruikt voor het welkomstbericht aan nieuwe gebruikers.

  • UserPoolName Een tekenreeks die wordt gebruikt om de user pool een naam te geven.

  • AttributesRequireVerificationBeforeUpdate Hiermee kunnen we specificeren welke gebruikersattributen verificatie vereisen voordat ze kunnen worden bijgewerkt. Wanneer een attribuut verificatie vereist voordat een update wordt uitgevoerd, worden wijzigingen in dat attribuut door de gebruiker pas van kracht nadat de gebruiker de wijzigingen heeft geverifieerd, doorgaans via een verificatiecode die via e-mail of SMS wordt verzonden.

  • Schema Hiermee kunnen we het schema definiëren voor de gebruikerspoolattributen. Het schema specificeert de attributen die zijn gekoppeld aan gebruikersprofielen in de user pool, inclusief hun gegevenstypen, beperkingen en of ze vereist zijn.

    • Name De naam van het attribuut.

    • AttributeDataType Het gegevenstype van het attribuut. Geldige waarden zijn onder meer String, Number, DateTime en Boolean.

    • Mutable Geeft aan of het attribuut kan worden gewijzigd. Als dit is ingesteld op True, kan het attribuut door gebruikers worden bijgewerkt. Als dit is ingesteld op False, vereisen wijzigingen in het attribuut verificatie.

    • Required Geeft aan of het attribuut vereist is.

  • EmailConfiguration Hiermee kunnen we e-mailgerelateerde instellingen configureren voor de user pool. Deze instellingen bepalen hoe AWS Cognito e-mailcommunicatie met gebruikers afhandelt, zoals het verzenden van verificatiecodes, instructies voor accountherstel en andere meldingen.

    • ReplyToEmailAddress De bestemming waarnaar de ontvanger van de e-mail moet antwoorden.

    • SourceArn De ARN van een geverifieerd e-mailadres of een adres van een geverifieerd domein in AWS SES.

    • ConfigurationSet De naam van de AWS SES-configuratieset die moet worden gebruikt bij het verzenden van e-mails.

    • EmailSendingAccount Specificeert of AWS Cognito zijn ingebouwde functionaliteit gebruikt om e-mailberichten te verzenden (COGNITO_DEFAULT) of onze AWS SES e-mailconfiguratie gebruikt (DEVELOPER).

    • From Identificeert hetzij het e-mailadres van de afzender of de naam van de afzender met hun e-mailadres.

User Pool Client

Een user pool client is een applicatie die is geregistreerd in de user pool en waarmee je applicaties kunnen communiceren met de user pool. Het is verantwoordelijk voor:

  • Tokenbeheer: De client ontvangt tokens (zoals ID-token, access token en refresh token) na succesvolle authenticatie. Deze tokens worden gebruikt om toegang te krijgen tot beveiligde resources in je applicatie.

  • Authenticatie-instellingen: De client definieert de configuratie voor de authenticatie, zoals de toegestane inlogmethoden (bijvoorbeeld alleen e-mail en wachtwoord) en de client-specifieke instellingen (bijvoorbeeld de token geldigheidsduur).

Zo maak je een User Pool Client aan:

  UserPoolClient:
    Type: "AWS::Cognito::UserPoolClient"
    DeletionPolicy: Retain
    Properties:
      ClientName: !Ref UserPoolClientName
      GenerateSecret: true
      UserPoolId: !Ref UserPool
      ExplicitAuthFlows:
        - ALLOW_ADMIN_USER_PASSWORD_AUTH
        - ALLOW_REFRESH_TOKEN_AUTH 
      SupportedIdentityProviders:
        - COGNITO
      PreventUserExistenceErrors: ENABLED

Outputs:
  CognitoUserPoolID:
    Value: !Ref UserPool
    Description: The UserPool id
  CognitoClientID:
    Value: !Ref UserPoolClient
    Description: The app client id
  CognitoClientSecret:
    Value: !GetAtt UserPoolClient.ClientSecret
    Description: The app client secret

Hier is een uitleg van de eigenschappen die worden gebruikt in de AWS::Cognito::UserPoolClient resource:

  • ClientName De naam van de client voor de user pool client die we willen aanmaken.

  • ExplicitAuthFlows AWS Cognito user pools API authenticatiestromen die we willen ondersteunen. Geldige waarden zijn onder andere:

    • ALLOW_USER_PASSWORD_AUTH Stelt de client-side authenticatiestroom op basis van wachtwoord in (client-side applicaties). In deze stroom ontvangt AWS Cognito het wachtwoord in platte tekst. Deze optie mag alleen worden gebruikt met vertrouwde clients.

    • ALLOW_USER_SRP_AUTH Vergelijkbaar met ALLOW_USER_PASSWORD_AUTH, maar maakt gebruik van het Secure Remote Password (SRP) protocol. SRP is een protocol voor veilige wachtwoord-gebaseerde authenticatie. Het stelt een client in staat om zich te authentiseren bij een server zonder het eigenlijke wachtwoord over het netwerk te verzenden. In plaats daarvan wordt een cryptografische uitwisseling uitgevoerd, waardoor de server de identiteit van de client kan verifiëren zonder ooit het wachtwoord zelf te zien. Deze optie is de beste optie voor onbetrouwbare clients.

    • ALLOW_REFRESH_TOKEN_AUTH Wanneer deze vlag is ingeschakeld, kan de client refresh tokens gebruiken om nieuwe ID- en toegangstokens te verkrijgen zonder de gebruiker opnieuw te hoeven authentiseren.

    • ALLOW_ADMIN_USER_PASSWORD_AUTH Stelt de admin user password-gebaseerde server-side authenticatiestroom in (veilige backend of server-side applicaties). Deze stroom moet worden gebruikt in specifieke scenario's waarin administratieve gebruikers zich rechtstreeks moeten authentiseren met hun gebruikersnaam en wachtwoord.

    • ALLOW_CUSTOM_AUTH Schakelt aangepaste authenticatiestromen binnen de user pool in. Ontwikkelaars kunnen aangepaste authenticatie-uitdagingen en -antwoorden implementeren, waardoor authenticatieworkflows op maat kunnen worden gecreëerd die zijn afgestemd op specifieke applicatievereisten met behulp van AWS Lambda-functies.

  • GenerateSecret Geeft aan of er een client secret moet worden gegenereerd voor de user pool client.

  • UserPoolId De ID van de user pool waarin we een user pool client willen aanmaken.

  • SupportedIdentityProviders Specificeert de lijst van identiteitsproviders die door de client worden ondersteund. De volgende providers worden ondersteund: COGNITO, Facebook, Google, SignInWithApple en LoginWithAmazon. We kunnen ook de namen specificeren die we hebben geconfigureerd voor de SAML- en OIDC-identiteitsproviders in onze user pool.

Ik heb drie output parameters toegevoegd aan het einde om de UserPoolId, de UserPoolClientId en UserPoolClientSecret te krijgen. Deze gegevens heb je nodig om vanuit de de applicatie te communiceren met de User Pool.

Het sjabloon implementeren

Deze beschreven configuratie is handig om snel een testomgeving op te zetten. Na het uitvoeren van de Cloudformation-sjabloon heb je een werkende omgeving waar je direct een applicatie op aan kunt sluiten.

Maak een sjabloon template.yaml aan en kopieer de twee bovenstaande scripts erin. Voer het sjabloon uit via de AWS Management Console. Voer daarvoor de stappen uit die staan beschreven in dit artikel.

Heeft dit artikel jou op weg geholpen?  Buy Me A Coffee

Aan de slag met AWS Cloudformation

Wilco van Dijk
Lees meer

Visual Studio inrichten voor AWS ontwikkeling

Wilco van Dijk
Lees meer

.Net configuratie opslaan in AWS Secrets Manager

Wilco van Dijk
Lees meer