AWS Cognito gebruik ik wanneer authenticatie een belangrijk onderdeel is van een applicatie, maar niet iets is wat ik zelf vanaf de basis wil bouwen en onderhouden. Het biedt een centrale plek voor gebruikersbeheer, authenticatie en het uitgeven van tokens richting applicaties en services.
Voor mij zit de waarde vooral in het scheiden van authentication van de daadwerkelijke businesslogica. Een backend moet weten wie iemand is en wat diegene mag doen, maar hoeft niet zelf verantwoordelijk te zijn voor wachtwoorden, token lifecycle en identity management.
Wat is AWS Cognito?
AWS Cognito is de identity-oplossing binnen AWS waarmee je onder andere gebruikers kunt registreren, authenticeren en autoriseren.
In backend-architecturen gebruik ik Cognito zowel voor normale user authentication als voor machine-to-machine communicatie.
Bij M2M gaat het niet om een gebruiker die handmatig inlogt, maar bijvoorbeeld om een service die zichzelf authenticeert richting een andere service. Cognito kan daarin een centrale rol spelen door tokens uit te geven die vervolgens door achterliggende services gevalideerd worden.
Dat sluit goed aan op microservice-architecturen waarin services duidelijk van elkaar gescheiden zijn.
Belangrijke dingen om te weten
User Pools en Identity Pools zijn niet hetzelfde
Een Cognito User Pool gebruik je voor gebruikersbeheer en authenticatie. Identity Pools zijn vooral bedoeld om gebruikers toegang te geven tot andere AWS-resources.
Dat onderscheid moet vanaf het begin duidelijk zijn. Anders wordt Cognito al snel ingewikkelder ingericht dan nodig.
Cognito werkt ook goed voor M2M
Ik gebruik Cognito ook voor machine-to-machine authentication.
Bijvoorbeeld wanneer een backend service gecontroleerd toegang moet krijgen tot een andere API. In plaats van zelf API keys of een custom authentication mechanisme te beheren, kan een service via Cognito een access token verkrijgen.
Dat vind ik vooral prettig omdat dezelfde securityprincipes vervolgens voor meerdere onderdelen van het platform gebruikt kunnen worden.
JWT is uiteindelijk maar een bewijs
Cognito werkt veel met JWT-tokens. Ik zie zo'n token als een bewijs van identiteit, niet als vervanging van je autorisatiemodel.
Authentication en authorization zijn twee verschillende verantwoordelijkheden.
Een gebruiker of service kan correct geauthenticeerd zijn en alsnog geen toegang mogen hebben tot bepaalde data of functionaliteit.
Houd Cognito buiten je domein
Ik probeer AWS Cognito niet diep te verweven met mijn businesslogica.
Mijn applicatie moet begrijpen welke rechten een gebruiker of service heeft. Of die identiteit vervolgens uit Cognito of een andere identity provider komt, hoort zoveel mogelijk een infrastructurele keuze te blijven.
Dat maakt een systeem eenvoudiger om later aan te passen.
Hoe ik AWS Cognito gebruik
Ik gebruik Cognito voornamelijk aan de rand van een systeem.
Bij gebruikers authenticatie logt een gebruiker in, ontvangt een token en gebruikt dit richting een API. Achterliggende services valideren vervolgens het token en halen alleen de informatie eruit die zij daadwerkelijk nodig hebben.
De frontend voor zo'n login flow bouw ik overigens nog steeds graag zelf.
Niet omdat Cognito dat niet kan overnemen, want je kunt bijvoorbeeld ook gebruikmaken van een hosted login-oplossing, maar simpelweg omdat ik het leuk vind om die gebruikerservaring zelf af te vangen. Daarmee houd ik controle over de look and feel, validatie en de interactie richting de gebruiker.
De daadwerkelijke identity en beveiliging laat ik vervolgens wel bij Cognito.
Voor mij is dat een mooie scheiding: zelf de gebruikerservaring bouwen, maar niet zelf opnieuw authentication proberen uit te vinden.
Wil je daar geen tijd aan besteden, dan kun je een groter deel van die login flow natuurlijk ook outsourcen.
Bij M2M werkt het principe anders. Daar communiceert geen gebruiker met Cognito, maar bijvoorbeeld een service. Die service haalt een token op en gebruikt dat om gecontroleerd een andere service aan te spreken.
Waar ik AWS Cognito heb gebruikt
Ik heb AWS Cognito toegepast binnen een SaaS-platform dat ik als freelance developer heb ontworpen en ontwikkeld.
Het platform bestond uit vijf microservices die via Kafka event-driven met elkaar communiceerden. Voor distributed transactions werd het Saga-pattern toegepast en Cognito verzorgde de authenticatie richting de services.
Juist binnen zo'n architectuur vond ik Cognito waardevol. De services konden zich concentreren op hun eigen verantwoordelijkheid, terwijl identity centraal werd afgehandeld.
Het platform vormde uiteindelijk ook de technische basis voor Debit55.
Mijn kijk op AWS Cognito
Ik vind Cognito vooral sterk wanneer je al binnen AWS werkt en identity snel, degelijk en schaalbaar wilt oplossen.
Ik gebruik het zowel voor gebruikers als voor service-to-service authentication, maar probeer er bewust niet meer verantwoordelijkheid in te stoppen dan nodig is.
Aan de voorkant maak ik soms juist bewust de keuze om bepaalde dingen wel zelf te bouwen. Een login scherm is daar een goed voorbeeld van. Niet alles hoeft geoutsourcet te worden alleen omdat het kan.
Mijn voorkeur blijft daarom:
Cognito voor identity en security, de applicatie voor domeinlogica en waar het waarde toevoegt zelf controle houden over de gebruikerservaring.
Veelgestelde vragen die ik krijg over AWS Cognito
Gebruik je Cognito ook voor machine-to-machine communicatie?
Ja. Juist voor service-to-service authentication vind ik Cognito interessant. Services kunnen tokens verkrijgen en elkaar vervolgens gecontroleerd aanspreken zonder dat ik zelf een custom authentication mechanisme hoef te onderhouden.
Bouw je de login pagina zelf?
Meestal wel. Dat vind ik simpelweg leuk om zelf te doen en het geeft mij volledige controle over de gebruikerservaring. De daadwerkelijke authentication laat ik vervolgens aan Cognito over.
Kun je de login flow ook volledig uitbesteden?
Ja. Cognito biedt mogelijkheden om een groter deel van de login flow te laten verzorgen. Als snelheid belangrijker is dan volledige controle over de frontend, kan dat een prima keuze zijn.
Gebruik je Cognito ook voor autorisatie?
Beperkt. Cognito kan claims en groepen meegeven, maar complexere autorisatieregels houd ik liever binnen het domein van de applicatie.
Past Cognito goed binnen microservices?
Ja, vooral wanneer je authentication centraal wilt organiseren voor zowel gebruikers als services. Daarmee voorkom je dat iedere microservice zijn eigen securityoplossing gaat ontwikkelen.