Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Invia attributi personalizzati ad Amazon Cognito e inseriscili in token
Carlos Alessandro Ribeiro e Mauricio Mendoza, Amazon Web Services
Riepilogo
L'invio di attributi personalizzati a un processo di autenticazione Amazon Cognito può fornire un contesto aggiuntivo a un'applicazione, consentire controlli di accesso più granulari e semplificare la gestione dei profili utente e dei requisiti di autenticazione. Queste funzionalità sono utili in un'ampia gamma di applicazioni e scenari e possono aiutarti a migliorare la sicurezza e la funzionalità complessive di un'applicazione.
Questo modello mostra come inviare attributi personalizzati a un processo di autenticazione Amazon Cognito quando un'applicazione deve fornire un contesto aggiuntivo al token di accesso o al token di identità (ID). Utilizzi Node.js come applicazione di backend. L'applicazione autentica un utente da un pool di utenti di Amazon Cognito e trasmette gli attributi personalizzati necessari per la generazione di token. Puoi utilizzare i AWS Lambda trigger per Amazon Cognito per personalizzare il processo di autenticazione senza grandi personalizzazioni del codice o sforzi significativi.
Importante
Il codice e gli esempi di questo modello non sono consigliati per i carichi di lavoro di produzione perché sono destinati esclusivamente a scopi dimostrativi. Per i carichi di lavoro di produzione, è richiesta una configurazione aggiuntiva sul lato client. Utilizzate questo modello come riferimento solo per proof-of-concept scopi pilota o a scopo pilota.
Prerequisiti e limitazioni
Prerequisiti
Un attivo Account AWS
Autorizzazioni per creare e gestire pool di utenti e funzioni di Amazon Cognito AWS Lambda
AWS Command Line Interface (AWS CLI), installato e configurato
Un ambiente di sviluppo integrato (IDE) che supporta Node.js
Node.js versione 18 o successiva, installata
TypeScript, installato
Limitazioni
Questo modello non è applicabile all'integrazione delle applicazioni tramite il flusso di autenticazione Client Credentials.
Il trigger di generazione del pre-token può aggiungere o modificare solo alcuni attributi del token di accesso e del token di identità. Per ulteriori informazioni, consulta Trigger Lambda prima della generazione di token nella documentazione di Amazon Cognito.
Architettura
Architettura Target
Il diagramma seguente mostra l'architettura di destinazione per questo modello. Mostra anche come l'applicazione Node.js potrebbe funzionare con un backend per aggiornare i database. Tuttavia, gli aggiornamenti del database di backend non rientrano nell'ambito di questo modello.

Il diagramma mostra il flusso di lavoro seguente:
L'applicazione Node.js emette un token di accesso con attributi personalizzati al pool di utenti di Amazon Cognito.
Il pool di utenti di Amazon Cognito avvia la funzione Lambda per la generazione di pre-token, che personalizza i token di accesso e ID.
L'applicazione Node.js effettua una chiamata API tramite Amazon API Gateway.
Nota
Gli altri componenti architettonici mostrati in questa architettura sono solo a titolo di esempio e non rientrano nell'ambito di questo modello.
Automazione e scalabilità
Puoi automatizzare il provisioning di pool di utenti AWS Lambda , funzioni, istanze di database e altre risorse di Amazon Cognito AWS CloudFormationutilizzando Terraform o qualsiasi strumento Infrastructure as Code (IaC) supportato. AWS Cloud Development Kit (AWS CDK)HashiCorp
Strumenti
Servizi AWS
Amazon API Gateway ti aiuta a creare, pubblicare, gestire, monitorare e proteggere REST, HTTP e WebSocket APIs su qualsiasi scala.
Amazon Cognito fornisce autenticazione, autorizzazione e gestione degli utenti per app Web e mobili.
Amazon Elastic Container Service (Amazon ECS) è un servizio rapido e scalabile di gestione dei container che ti aiuta a eseguire, arrestare e gestire container in un cluster.
AWS Lambda è un servizio di calcolo che consente di eseguire il codice senza gestire i server o effettuarne il provisioning. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.
AWS SDK per JavaScriptfornisce un' JavaScript API per. Servizi AWSÈ possibile utilizzarlo per creare librerie o applicazioni per Node.js o per il browser.
Altri strumenti
Node.js
è un ambiente di JavaScript runtime basato sugli eventi progettato per la creazione di applicazioni di rete scalabili. npm
è un registro software che viene eseguito in un ambiente Node.js e viene utilizzato per condividere o prendere in prestito pacchetti e gestire la distribuzione di pacchetti privati.
Best practice
Ti consigliamo di implementare le seguenti best practice:
Segreti e dati sensibili: non archiviate segreti o dati sensibili all'interno dell'applicazione. Utilizzate un sistema esterno da cui l'applicazione può estrarre i dati AWS AppConfigAWS Secrets Manager, ad esempio AWS Systems Manager Parameter Store.
Distribuzione standardizzata: utilizza CI/CD le pipeline per distribuire le applicazioni. È possibile utilizzare servizi come e. AWS CodeBuildAWS CodePipeline
Scadenza del token: imposta una data di scadenza breve per il token di accesso.
Utilizza una connessione sicura: tutte le comunicazioni tra l'applicazione client e il backend devono essere crittografate utilizzando SSL/TLS. Usa AWS Certificate Manager (ACM) per generare e gestire SSL/TLS certificati e usa Amazon CloudFront o Elastic Load Balancing per gestire SSL/TLS la terminazione.
Convalida l'input dell'utente: assicurati che tutti gli input dell'utente siano convalidati per prevenire attacchi di iniezione e altre vulnerabilità di sicurezza. Utilizza librerie e servizi di convalida degli input come Amazon API Gateway e AWS WAFper prevenire i vettori di attacco comuni.
Usa i ruoli IAM: utilizza i ruoli AWS Identity and Access Management (IAM) per controllare l'accesso alle AWS risorse e assicurarti che solo gli utenti autorizzati abbiano accesso. Segui il principio del privilegio minimo e assicurati che ogni utente disponga solo delle autorizzazioni necessarie per svolgere il proprio ruolo.
Utilizza una politica in materia di password: configura una politica di password che soddisfi i requisiti di sicurezza, come lunghezza minima, complessità e scadenza. Usa Secrets Manager o AWS Systems Manager Parameter Store per archiviare e gestire le password in modo sicuro.
Abilita l'autenticazione a più fattori (MFA): abilita l'MFA per tutti gli utenti per fornire un ulteriore livello di sicurezza e ridurre il rischio di accessi non autorizzati. Usa AWS IAM Identity CenterAmazon Cognito per abilitare l'MFA e altri metodi di autenticazione.
Archivia le informazioni sensibili in modo sicuro: archivia le informazioni sensibili, come password e token di accesso, in modo sicuro utilizzando AWS Key Management Service ()AWS KMS o altri servizi di crittografia.
Utilizza metodi di autenticazione avanzati: per aumentare la sicurezza del processo di autenticazione, utilizza metodi di autenticazione avanzati, come l'autenticazione biometrica o l'autenticazione a più fattori.
Monitoraggio di attività sospette: utilizza altri strumenti di monitoraggio per monitorare attività sospette AWS CloudTraile potenziali minacce alla sicurezza. Imposta avvisi automatici per attività insolite e usa Amazon GuardDuty o AWS Security Hubper rilevare potenziali minacce.
Rivedi e aggiorna regolarmente le politiche di sicurezza: rivedi e aggiorna regolarmente le politiche e le procedure di sicurezza per assicurarti che soddisfino i requisiti di sicurezza e le migliori pratiche in evoluzione. AWS Config Utilizzatelo per tenere traccia e verificare le modifiche alle politiche e alle procedure di sicurezza.
Registrazione automatica: non abilitare l'iscrizione automatica a un pool di utenti di Amazon Cognito. Per ulteriori informazioni, consulta Ridurre i rischi di frode nelle iscrizioni degli utenti e di invio di SMS con i pool di utenti di Amazon Cognito
AWS (post sul blog).
Per ulteriori best practice, consulta la sezione Best practice di sicurezza per i pool di utenti di Amazon Cognito nella documentazione di Amazon Cognito.
Epiche
| Attività | Descrizione | Competenze richieste |
|---|---|---|
Crea un pool di utenti. |
Per ulteriori informazioni e istruzioni su come configurare un pool di utenti in AWS Management Console, consulta Introduzione ai pool di utenti e Aggiungere altre funzionalità e opzioni di sicurezza al pool di utenti. SuggerimentoPer ridurre i costi, utilizza il piano Essentials o il piano Lite per testare questo modello. Per ulteriori informazioni, consulta i prezzi di Amazon Cognito | Sviluppatore di app, AWS DevOps |
Aggiungi un utente al pool di utenti. | Inserisci il seguente comando per creare un utente nel pool di utenti di Amazon Cognito:
| Sviluppatore di app, AWS DevOps |
Aggiungi il client dell'app al pool di utenti. |
| Amministratore di sistema AWS, amministratore AWS, AWS DevOps, sviluppatore di app |
Crea un trigger Lambda per la generazione di pre-token. |
| AWS DevOps, sviluppatore di app |
Personalizza il flusso di lavoro del pool di utenti. |
Per ulteriori informazioni, consulta Personalizzazione dei flussi di lavoro del pool di utenti con i trigger Lambda nella documentazione di Amazon Cognito. | AWS DevOps, sviluppatore di app |
| Attività | Descrizione | Competenze richieste |
|---|---|---|
Creare l'applicazione Node.js. |
| Sviluppatore di app |
Implementa la logica di autenticazione. |
NotaÈ possibile creare il proprio TypeScript file o modificare l'esempio fornito in base alle esigenze del caso d'uso. | Sviluppatore di app |
Configura le variabili di ambiente e il file di configurazione. | In un terminale, inserisci i seguenti comandi per creare le variabili di ambiente:
ImportanteNon codificate segreti né rivelate le vostre credenziali. | Sviluppatore di app |
Esegui l'applicazione. | Immettete i seguenti comandi per eseguire l'applicazione e confermare che funzioni:
| Sviluppatore di app |
Verificate che gli attributi personalizzati vengano inseriti nei token. | Utilizza le funzionalità di debug del tuo IDE per visualizzare i token di accesso e ID. Conferma che gli attributi personalizzati sono stati aggiunti. Per i token di esempio, consulta la sezione Informazioni aggiuntive di questo modello. | Sviluppatore di app |
Risoluzione dei problemi
| Problema | Soluzione |
|---|---|
ID client non valido quando si tenta di autenticare l'utente | Questo errore si verifica in genere quando si utilizza un ID client con un client secret generato. È necessario creare un ID cliente senza un segreto associato. Per ulteriori informazioni, consulta Impostazioni specifiche dell'applicazione con i client dell'app. |
Risorse correlate
Personalizzazione dei flussi di lavoro dei pool di utenti con trigger Lambda (documentazione di Amazon Cognito)
Trigger Lambda prima della generazione di token (documentazione di Amazon Cognito)
CognitoIdentityProviderClient(documentazione)AWS SDK per JavaScript
cognito-idp
(documentazione)AWS CLI
Informazioni aggiuntive
File di TypeScript esempio
Il seguente esempio di codice è un TypeScript file che richiama il processo di autenticazione utilizzando un AWS SDK per inviare attributi personalizzati ad Amazon Cognito:
import * as AmazonCognitoIdentity from "amazon-cognito-identity-js"; const userPoolId: string = process.env.USER_POOL_ID ?? ''; const clientId: string = process.env.CLIENT_ID ?? ''; const poolData = { UserPoolId: userPoolId, ClientId: clientId }; const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); export const loginWithCognitoSDK = function (userName: string, password: string) { const authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails({ Username: userName, Password: password, ClientMetadata: { customGroup: "MyCustomGroup", customApplicationData: "Custom data from a custom application" } }); const userData = { Username: userName, Pool: userPool }; const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData); // Authenticate the user using the authenticationDetails object cognitoUser.authenticateUser(authenticationDetails, { onSuccess: function (result: any) {}, onFailure: function (err: any) {}, }); } loginWithCognitoSDK(process.env.USERNAME ?? '', process.env.PASSWORD ?? '');
L'esempio utilizza il AuthenticationDetails modello dell'SDK per JavaScript fornire il nome utente, la password e il. ClientMetadada Dopo l'autenticazione in Amazon Cognito, i metadati del client possono essere recuperati dai token di accesso e ID.
Funzione Lambda di esempio
Il seguente esempio di codice è una funzione Lambda collegata al token di pre-generazione di Amazon Cognito. Ti aiuta a personalizzare il token di accesso e il token ID utilizzati da Amazon Cognito. I token vengono passati attraverso le integrazioni tra le tue architetture. Questo esempio include un attributo di reclamo personalizzato chiamato customApplicationData e un nome di gruppo personalizzato chiamato: MyCustomGroup
export const handler = async(event, context, callback) => { event.response = { claimsOverrideDetails: { claimsToAddOrOverride: { customApplicationData: event.request.clientMetadata.customApplicationData }, groupOverrideDetails: { groupsToOverride: [event.request.clientMetadata.customGroup] } } }; callback(null, event); };
Esempio di token di accesso
È possibile decodificare il token di accesso per visualizzare gli attributi personalizzati che sono stati aggiunti. Di seguito è riportato un esempio di token di accesso:
{ "sub": "6daf331f-4451-48b4-abde-774579299204", "cognito:groups": [ "MyCustomGroup" ], "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>", "client_id": "<YOUR_CLIENT_ID>", "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc", "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e", "token_use": "access", "scope": "aws.cognito.signin.user.admin", "auth_time": 1677979246, "exp": 1677982846, "iat": 1677979246, "jti": "5c9c2708-a871-4428-bd9b-18ad261bea90", "username": "<USER_NAME>" }
Token ID di esempio
È possibile decodificare il token di accesso per visualizzare gli attributi personalizzati che sono stati aggiunti. Di seguito è riportato un esempio di token di accesso:
{ "sub": "6daf331f-4451-48b4-abde-774579299204", "cognito:groups": [ "MyCustomGroup" ], "iss": "https://cognito-idp.<REGION>.amazonaws.com/<USERPOOL_ID>", "cognito:username": "<USER_NAME>", "origin_jti": "acff7e91-09f9-4fde-8eec-38b0f8c47cdc", "customApplicationData": "Custom data from a custom application", "aud": "<YOUR_CLIENT_ID>", "event_id": "c5113a9c-1f01-435b-9b73-a5cd3e88514e", "token_use": "id", "auth_time": 1677979246, "exp": 1677982846, "iat": 1677979246, "jti": "f7ca006b-f25b-44d2-a7a4-6e6423f4201f", "email": "<USER_EMAIL>" }