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 opFalse
(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 opFalse
, 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 meerString
,Number
,DateTime
enBoolean
.Mutable
Geeft aan of het attribuut kan worden gewijzigd. Als dit is ingesteld opTrue
, kan het attribuut door gebruikers worden bijgewerkt. Als dit is ingesteld opFalse
, 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 metALLOW_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.