Invia attributi personalizzati ad Amazon Cognito e inseriscili in token - Prontuario AWS

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

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.

Un'applicazione Node.js che emette un token di accesso con attributi personalizzati per un pool di utenti di Amazon Cognito.

Il diagramma mostra il flusso di lavoro seguente:

  1. L'applicazione Node.js emette un token di accesso con attributi personalizzati al pool di utenti di Amazon Cognito.

  2. 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.

  3. 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 Se desideri scalare le tue implementazioni, utilizza pipeline di integrazione continua e distribuzione continua (CI/CD), che aiutano a prevenire gli errori associati alle distribuzioni manuali.

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 CognitoAWS (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àDescrizioneCompetenze richieste

Crea un pool di utenti.

  1. In un terminale CLI, inserisci il seguente comando per creare un pool di utenti Amazon Cognito:

    aws cognito-idp create-user-pool \ --pool-name <MyUserPool>
  2. Inserisci il seguente comando per creare un ID client e un segreto da utilizzare con l'SDK per: JavaScript

    aws cognito-idp create-user-pool-client \ --user-pool-id <UserPoolID> \ --client-name <MyNewClient> \ --no-generate-secret \ --explicit-auth-flows "USER_PASSWORD_AUTH" "ADMIN_NO_SRP_AUTH"

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.

Suggerimento

Per 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:

aws cognito-idp sign-up \ --client-id <ClientID> \ --username <jane@example.com> \ --password <PASSWORD> \ --user-attributes Name="email",Value="<jane@example.com>" Name="name",Value="<Jane>"
Sviluppatore di app, AWS DevOps

Aggiungi il client dell'app al pool di utenti.

  1. Passa alla console di Amazon Cognito.

  2. Scegli Bacini d'utenza.

  3. Scegli il pool di utenti che hai creato in precedenza.

  4. In Definisci la tua applicazione, scegli il tipo di applicazione più adatto allo scenario applicativo per il quale desideri creare servizi di autenticazione e autorizzazione.

  5. In Assegna un nome all'applicazione, inserisci un nome descrittivo o procedi con il nome predefinito.

  6. In Aggiungi un URL di ritorno, inserisci un percorso di reindirizzamento all'applicazione per dopo che gli utenti hanno completato l'autenticazione.

  7. Scegli Crea la tua applicazione. Puoi configurare le opzioni avanzate dopo aver creato il client dell'app.

Amministratore di sistema AWS, amministratore AWS, AWS DevOps, sviluppatore di app

Crea un trigger Lambda per la generazione di pre-token.

  1. Apri la pagina Funzioni della console Lambda.

  2. Scegli Crea funzione.

  3. Scegli Crea da zero.

  4. Nel riquadro Informazioni di base, per Nome della funzione, immettere. myPreTokenGenerationLambdaFunction

  5. Per Runtime, scegliete Node.js 22.

  6. Lasciate l'architettura impostata su x86_64.

  7. Scegli Crea funzione.

  8. Nella scheda Codice, in Codice sorgente, inserisci la funzione Lambda di esempio dalla sezione Risorse aggiuntive di questo modello. Questa funzione Lambda inserisce gli attributi personalizzati nel token ID e nel token di accesso.

AWS DevOps, sviluppatore di app

Personalizza il flusso di lavoro del pool di utenti.

  1. Passa alla console di Amazon Cognito.

  2. Scegli Bacini d'utenza.

  3. Scegli il pool di utenti che hai creato in precedenza.

  4. Nel riquadro di navigazione a sinistra, sotto Autenticazione, scegli Estensioni.

  5. Scegli Aggiungi trigger Lambda.

  6. Aggiungi o modifica un Trigger di pre-generazione di token.

  7. Per il tipo di trigger, scegli Autenticazione.

  8. In Autenticazione, scegli Pre token generation trigger.

  9. Per Assegna funzione Lambda, scegli. myPreTokenGenerationLambdaFunction

  10. Scegli Aggiungi trigger Lambda.

  11. Scegli una versione dell'evento Trigger di Funzionalità di base + personalizzazione del token di accesso per le identità utente o Funzionalità di base + personalizzazione del token di accesso per le identità di utente e macchina. Questa impostazione aggiorna i parametri di richiesta inviati da Amazon Cognito alla funzione per includere campi per la personalizzazione del token di accesso.

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àDescrizioneCompetenze richieste

Creare l'applicazione Node.js.

  1. In un terminale, immettete i seguenti comandi:

    mkdir my-app cd my-app npm init -y npm install --save-dev typescript npm i --save-dev @types/node npm i amazon-cognito-identity-js npx tsc --init mkdir src touch src/index.ts
  2. Modifica il package.json file per includere gli script di TypeScript compilazione:

    "scripts": { "start": "node src/index.js", "build": "tsc" },
Sviluppatore di app

Implementa la logica di autenticazione.

  1. Apri il file index.ts.

  2. Incolla il Typescript di esempio fornito nella sezione Risorse aggiuntive di questo modello.

  3. Salvare e chiudere il file index.ts.

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:

export USERNAME="<COGNITO_USER_NAME>" export PASSWORD="<COGNITO_USER_PASSWORD>" export USER_POOL_ID="<COGNITO_USER_ID>" export CLIENT_ID="<COGNITO_CLIENT_ID>"
Importante

Non 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:

npm run build npm start
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

ProblemaSoluzione

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

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>" }