Introduzione ad Amazon Cognito
Oggi mostreremo alcune operazioni di base sui bacini di utenza Cognito (Cognito User Pools).
Servizi che consentono di gestire facilmente gli utenti, attraverso, ad esempio, autenticazioni personalizzate, funzionalità di registrazione, recupero password o integrazione con identity provider esterni.
I bacini di utenza Cognito offrono un’infrastruttura robusta per gestire l’intero ciclo di vita degli utenti, scopriamoli meglio!
Pool di utenti Cognito (Cognito User Pool)
In un mondo dove l’uso dei servizi cloud è sempre più diffuso, la gestione dell’identità e dell’autenticazione sicure ed efficienti giocano un ruolo cruciale. In questo contesto, Amazon Cognito si distingue come una soluzione potente ed elastica.
Si tratta di uno dei componenti chiave del vasto ecosistema dei servizi AWS e rappresenta un pilastro per garantire l’accesso ad applicazioni web e mobile. In breve, i servizi offerti da Amazon Cognito permettono di concentrarsi sullo sviluppo delle nostre applicazioni senza doversi preoccupare eccessivamente della sicurezza e del flusso dell’autenticazione.
Creazione di un pool di utenti
Effettuiamo il login sulla console AWS e andiamo all’indirizzo https://console.aws.amazon.com/cognito/home, così da raggiungere direttamente la pagina iniziale di Amazon Cognito e clicchiamo sul pulsante arancione in evidenza Crea bacino di utenza.
Ricordiamo che le pool di utenti sono risorse legate a una specifica regione AWS, dunque prima di procedere è fondamentale controllare che ci troviamo nella regione AWS corretta, verificando dal menù a tendina nella barra superiore.
Inoltre se l’utente con il quale siamo loggati su AWS non dovesse avere una policy che consente le operazioni base su Cognito, sarà impossibile procedere. Verificate di avere i giusti permessi prima di andare avanti.
La procedura di creazione è articolata in sei fasi, a cui corrispondono altrettante schermate.
Vediamole insieme.
Configurazione della schermata di accesso
Qui è possibile scegliere tra bacino di utenza Cognito, l’opzione predefinita, oppure Provider di identità federate. Approfondiremo in seguito questo aspetto, per ora manteniamo l’opzione predefinita. Successivamente possiamo scegliere uno o più degli attributi fondamentali per eseguire l’accesso tra nome utente, e-mail e numero di telefono.
Si tratta di un passaggio molto importante perché questi attributi non possono essere modificati dopo la creazione del pool. Scegliendo nome utente compare un ulteriore campo di selezione. È consigliato non spuntare la casella Fai distinzione tra maiuscole e minuscole del nome utente, in quanto comporta la configurazione di misure di sicurezza aggiuntive.
Clicchiamo su successivo.
Configurazione dei requisiti di sicurezza
Alla voce Policy delle password specifichiamo i criteri che dovranno rispettare le password degli utenti in fase di registrazione: è sufficiente cliccare su Personalizzata, spuntare le caselle desiderate e modificare i campi di testo. In alternativa, possiamo affidarci ai valori predefiniti offerti da Cognito. Successivamente possiamo decidere se abilitare l’Autenticazione a più fattori nel flusso della nostra applicazione – l’opzione consigliata è di farlo tramite un’applicazione come Google Authenticator.
Infine, alla voce Recupero dell’account utente è una scelta quasi obbligata spuntare la check box e uno dei campi successivi: in questo modo nella schermata di accesso comparirà in automatico il link “Hai dimenticato la password?”, cliccando sul quale verrà inviato un codice di recupero secondo la modalità scelta. Clicchiamo su successivo.
Configurazione dell’esperienza di iscrizione
Alla voce Iscrizione self-service possiamo decidere se abilitare o meno gli utenti a registrarsi autonomamente alla nostra applicazione. È importante che questa opzione sia selezionata solo nel momento in cui vogliamo aprire l’app alla registrazione pubblica.
Nella sezione Verifica dell’attributo e conferma dell’account utente spuntiamo la casella Consenti a Cognito di inviare automaticamente messaggi per la verifica e la conferma (l’alternativa è una procedura molto più complessa che coinvolge la creazione e la configurazione di una serie di funzioni Lambda) e possiamo specificare la modalità di verifica. Nelle sezioni finali di questa schermata possiamo indicare una serie di attributi obbligatori da inserire al momento della registrazione, partendo da un set predefinito messo a disposizione da Cognito. È anche possibile creare attributi personalizzati, specifici alle finalità della nostra applicazione. Clicchiamo su successivo.
Configurazione della consegna dei messaggi
Qui possiamo scegliere il servizio che si occuperà della consegna dei messaggi. In base alle scelte operate nelle schermate precedenti potremmo visualizzare una sola tra le sezioni E-mail e Sms oppure entrambe.
Quando si tratta di mandare E-mail, la scelta è tra Cognito oppure Amazon Simple Email Service (SES).
La differenza sta nella capacità limitata a cinquanta mail giornaliere di Cognito: si tratta di un valore accettabile in sviluppo e testing della nostra applicazione ma assolutamente insufficiente per gestire la fase di produzione, nel qual caso Amazon SES è la scelta corretta.
Possiamo scegliere nei campi successivi la regione in cui verrà attivato il servizio SES, di solito la stessa associata al nostro bacino di utenza, un indirizzo mail no-reply ed eventualmente un ulteriore indirizzo mail con il quale si potrà interagire con gli utenti della nostra applicazione.
Per quanto riguarda l’invio di Sms il servizio preposto è Amazon Simple Notification Service (SNS), a cui viene associato un ruolo IAM con i permessi necessari. Al primo accesso dovremo creare un nuovo ruolo, altrimenti è possibile cliccare su Utilizza un ruolo IAM esistente e come prima selezionare la regione corretta. Clicchiamo su successivo.
Integra la tua app
In questa schermata limitiamoci per ora ad assegnare un nome sia al pool di utenti che abbiamo configurato, sia a uno degli app client che lo utilizzerà.
Manteniamo tutte le altre opzioni come predefinite, ci sarà modo di modificarle in seguito.
Clicchiamo su successivo.
Esamina e crea
Verifichiamo le scelte operate nelle schermate precedenti e una volta che siamo soddisfatti del risultato, clicchiamo su Crea pool di utenti.
Veniamo reindirizzati alla pagina Pool di utenti dove si trova il bacino di utenza appena creato.
Aggiunta di un client e configurazione dell’interfaccia utente
Cliccando sul nome, accediamo a una schermata di dettaglio dove troviamo diverse tab: Utenti, Gruppi, Esperienza di accesso, Esperienza di registrazione, Messaggistica, Integrazione app, Proprietà del gruppo di utenti. In ciascuna di queste tab è possibile modificare alcune – non tutte! – delle impostazioni specificate durante il processo di creazione.
D’ora in poi lavoreremo sulla tab Integrazione app.
Configurazione del dominio
Alla sezione Dominio, possiamo configurare il dominio che andrà a ospitare l’interfaccia utente.
Cliccando su Operazioni, abbiamo la possibilità di utilizzare un dominio Cognito oppure un dominio personalizzato: la prima opzione è preferibile in quanto più immediata, mentre la seconda prevede l’uso di un registro DNS e di un certificato rilasciato da AWS Certificate Manager per garantire la sicurezza delle connessioni tra gli utenti e i servizi AWS.
Scegliamo Crea un dominio Cognito, inseriamo un nome verificando che sia disponibile e clicchiamo sul pulsante di creazione.
Configurazione del client
Ora scorriamo verso il basso fino alla sezione Client di app e analisi dei dati. E’ importante notare che è possibile aggiungere più di un client in questa sezione: sicuramente sarà presente il client indicato in fase di creazione del pool (nel mio caso, DemoClient). Clicchiamo su Crea client dell’app per aggiungerne un altro e configurarlo da zero.
La prima scelta dipende dalla tipologia di applicazione con cui vogliamo integrare Cognito: se si tratta di un app nativa, web o per dispositivi mobili scegliamo Client pubblico, mentre Client riservato è perfetta per applicazioni lato server. La terza opzione ci fornisce un controllo maggiore sulla personalizzazione di alcune impostazioni, che negli altri casi sono scelte di default da Cognito. Per gli scopi di questo tutorial, scegliamo Client pubblico.
Dopo aver inserito il nome del nuovo client, consigliamo di mantenere le impostazioni predefinite nelle sezioni Segreto del client e Flussi di autenticazione, verificando che sia selezionata la voce ALLOW_USER_SRP_AUTH.
Alla voce Impostazioni dell’interfaccia utente ospitata, possiamo specificare due tipi di URL: gli URL di callback e gli URL di disconnessione.
I primi corrispondono alla pagina dove l’utente viene reindirizzato dopo una corretta procedura di autenticazione: devono iniziare con https:// per applicazioni lato web, myapp:// per applicazioni lato mobile, che siano Android o iOS.
I secondi corrispondono alla pagina dove l’utente viene reindirizzato dopo aver eseguito un logout. Inseriamo https://example.com nel campo URL di callback e procediamo.
Nella sezione Provider di identità allo stato attuale appare selezionabile solo Pool di utenti Cognito.
Nella sezione Tipi di concessione OAuth 2.0, scegliere Concessione del codice di autorizzazione fa in modo che le nostre richieste di accesso restituiscano un codice. Questo codice verrà scambiato per i token corrispondenti al nostro bacino di utenza.
Di fatto, i token non vengono mai esposti all’utente finale, rafforzandone la sicurezza e questo scambio viene gestito per noi da Cognito (purché sia stato scelto Client pubblico o Client riservato all’inizio della schermata).
Scegliere Concessione Implicita fa in modo che Cognito restituisca direttamente i JSON Web Token del bacino di utenza. In linea teorica queste due possibilità non sono in conflitto tra di loro: possiamo selezionarle entrambe e personalizzarne l’uso all’interno della nostra applicazione in base alle esigenze. La console di Cognito ci viene incontro suggerendo che per un client pubblico la prima opzione è quella consigliata.
Nella sezione OpenID Connect è consigliato selezionare tutti gli attributi disponibili. Infine, possiamo visionare le autorizzazioni di lettura e scrittura relative a tutta una serie di attributi: quelli presenti di default nella sezione attributi obbligatori in fase di creazione della pool e quelli personalizzati, specificati da noi durante la stessa.
Clicchiamo su Crea client dell’app.
Accesso e personalizzazione dell’interfaccia
Tornando alla tab Integrazione app, copiamo l’indirizzo in Dominio Cognito e incolliamolo in una nuova tab del browser: la pagina rimarrà bianca.
Questo comportamento è del tutto normale, perché non stiamo fornendo nessuna informazione specifica alla nostra applicazione. La struttura corretta dell’url comprende non solo il dominio ma anche il client ID e l’url di callback.
Per accedere basta andare alla voce Client di app e analisi dei dati, cliccare sul client appena creato e scendere fino a Interfaccia utente ospitata. Scegliamo Visualizza l’interfaccia utente ospitata per aprire una pagina e vedremo una box di autenticazione:
Trattandosi del primo accesso, clicchiamo su Sign up e inseriamo le nostre informazioni. Riceveremo un codice di verifica via e-mail o sms e subito dopo configureremo l’autenticazione a più fattori (se specificato in fase di creazione della pool).
Una volta abilitata, riusciamo correttamente a visualizzare il nostro url di callback corrispondente alla pagina di example.com, come desiderato.
Abbiamo appena descritto lo stesso flusso di autenticazione che seguiranno gli utenti della nostra app. Possiamo verificare che l’utente è stato correttamente aggiunto nel bacino di utenza Cognito dalla tab Utenti:
Infine, nella schermata di dettaglio del client alla voce Personalizzazione dell’interfaccia utente ospitata abbiamo la possibilità di inserire un’immagine in formato .jpg, .jpeg o .png che fungerà da logo della nostra applicazione e verrà visualizzata all’interno della box di autenticazione.
In alternativa è possibile caricare un file CSS per avere una maggiore libertà sullo stile.
Aggiunta di un accesso social a un pool di utenti
Vedremo ora come è possibile abilitare gli utenti della nostra applicazione ad accedere tramite un identity provider (IdP) social come Facebook, Google, Amazon e Apple.
Essendo un’opzione facoltativa, non è necessario configurarla in fase di creazione della pool ma può essere aggiunta in un secondo momento come faremo ora.
Registrazione con un identity provider social
La prima operazione consiste nel registrare la nostra applicazione con l’IdP social in modo da ottenere un client ID e un client secret.
I dettagli di questa operazione vanno oltre agli scopi di questo articolo, ma uno dei punti chiave prevede la creazione di un account sviluppatore presso l’IdP che vogliamo integrare nella nostra app.
Aggiunta di un identity provider al bacino di utenza
Dalla schermata Pool di utenti clicchiamo sulla nostra pool, andiamo alla tab Esperienza di accesso e nella sezione Accesso del provider di identità federate, clicchiamo su Aggiungi provider di identità. La procedura per integrare gli identity provider menzionati è perfettamente speculare tra Facebook, Google e Amazon, e cambia di poco se vogliamo integrare Apple. Per questo tutorial abbiamo scelto di integrare Facebook nella nostra applicazione.
Scegliendo Facebook, dovremo inserire il client ID e il client secret nominati in precedenza. La voce Ambiti autorizzati si riferisce a gruppi di attributi che verranno scambiati tra Facebook e la nostra applicazione. Riportiamo qui qualche esempio di ambito per ciascuno degli identity provider:
- Facebook: public_profile, email
- Google: profile, email, openid
- Amazon: profile, postal_code
- Apple: email, name
È opportuno impostare la voce Versione dell’API della grafica Facebook alla versione più recente possibile. Infine è possibile mappare gli attributi del nostro bacino di utenza, segnati come obbligatori in fase di registrazione, ai loro corrispettivi integrati su Facebook.
Terminiamo cliccando su Aggiungi provider.
Configurazione del nuovo provider nel client dell’app
Per rendere effettiva la modifica, torniamo alla tab Integrazione app e clicchiamo sul client che abbiamo configurato.
Alla sezione Interfaccia utente ospitata, clicchiamo su Modifica
e scorriamo verso il basso fino a Provider di identità. Se prima l’unica opzione visibile nel menù a tendina era Pool di utenti Cognito, ora dovremmo visualizzare anche Facebook: selezioniamo la casella e clicchiamo su Salva modifiche.
Se ora premiamo su Visualizza l’interfaccia utente ospitata, dovremmo vedere correttamente la nuova modifica e l’integrazione con Facebook nella box di autenticazione. Se risultiamo ancora loggati, è sufficiente aprire una nuova tab in incognito per verificare la modifica.
In chiusura, i tutorial illustrati ci hanno dato un assaggio del perché Amazon Cognito sia considerato, ad oggi, una risorsa indispensabile nello sviluppo di applicazioni moderne, sicure ed efficienti.
La sua integrazione con altri servizi cloud di AWS consente di concentrarsi sulla logica delle proprie applicazioni, sapendo che la gestione dell’identità è nelle mani di un sistema affidabile.
Che il nostro percorso nello sviluppo di applicazioni sia appena iniziato o che siamo esperti del cloud, la potenza e la flessibilità di Amazon Cognito si adattano a ogni scenario, confermando il suo ruolo di protagonista per quanto riguarda la gestione dell’identità.
Vuoi maggiori informazioni?
Cerchi sviluppatori AWS a supporto delle tue attività professionali?
Compila i campi qui sotto, ti ricontatteremo quanto prima.