Senden Sie benutzerdefinierte Attribute an Amazon Cognito und fügen Sie sie in Token ein - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Senden Sie benutzerdefinierte Attribute an Amazon Cognito und fügen Sie sie in Token ein

Carlos Alessandro Ribeiro und Mauricio Mendoza, Amazon Web Services

Übersicht

Das Senden von benutzerdefinierten Attributen an einen Amazon Cognito Cognito-Authentifizierungsprozess kann einer Anwendung zusätzlichen Kontext bieten, detailliertere Zugriffskontrollen ermöglichen und die Verwaltung von Benutzerprofilen und Authentifizierungsanforderungen vereinfachen. Diese Funktionen sind in einer Vielzahl von Anwendungen und Szenarien nützlich und können Ihnen helfen, die allgemeine Sicherheit und Funktionalität einer Anwendung zu verbessern.

Dieses Muster zeigt, wie benutzerdefinierte Attribute an einen Amazon Cognito Cognito-Authentifizierungsprozess gesendet werden, wenn eine Anwendung zusätzlichen Kontext für das Zugriffstoken oder das Identitätstoken (ID) bereitstellen muss. Sie verwenden die Datei Node.js als Backend-Anwendung. Die Anwendung authentifiziert einen Benutzer aus einem Amazon Cognito Cognito-Benutzerpool und übergibt benutzerdefinierte Attribute, die für die Token-Generierung benötigt werden. Sie können AWS Lambda Trigger für Amazon Cognito verwenden, um Ihren Authentifizierungsprozess ohne größere Code-Anpassungen oder großen Aufwand anzupassen.

Wichtig

Der Code und die Beispiele in diesem Muster werden nicht für Produktionsworkloads empfohlen, da sie nur zu Demonstrationszwecken bestimmt sind. Für Produktionsworkloads ist eine zusätzliche Konfiguration auf der Clientseite erforderlich. Verwenden Sie dieses Muster nur als Referenz für Pilotprojekte oder für proof-of-concept andere Zwecke.

Voraussetzungen und Einschränkungen

Voraussetzungen

Einschränkungen

  • Dieses Muster gilt nicht für die Anwendungsintegration über den Authentifizierungsablauf mit Client-Anmeldeinformationen.

  • Mit dem Trigger vor der Token-Generierung können nur einige Attribute des Zugriffs- und Identitätstokens hinzugefügt oder geändert werden. Weitere Informationen finden Sie unter Lambda-Trigger vor der Token-Generierung in der Amazon Cognito Cognito-Dokumentation.

Architektur

Zielarchitektur

Das folgende Diagramm zeigt die Zielarchitektur für dieses Muster. Es zeigt auch, wie die Anwendung Node.js mit einem Backend zusammenarbeiten könnte, um Datenbanken zu aktualisieren. Die Backend-Datenbankaktualisierungen fallen jedoch nicht in den Geltungsbereich dieses Musters.

Eine Node.js -Anwendung, die ein Zugriffstoken mit benutzerdefinierten Attributen für einen Amazon Cognito Cognito-Benutzerpool ausgibt.

Das Diagramm zeigt den folgenden Workflow:

  1. Die Anwendung Node.js gibt ein Zugriffstoken mit benutzerdefinierten Attributen für den Amazon Cognito Cognito-Benutzerpool aus.

  2. Der Amazon Cognito Cognito-Benutzerpool initiiert die Lambda-Funktion vor der Token-Generierung, mit der die Zugriffs- und ID-Token angepasst werden.

  3. Die Anwendung Node.js führt einen API-Aufruf über Amazon API Gateway durch.

Anmerkung

Die anderen in dieser Architektur gezeigten Architekturkomponenten dienen nur als Beispiel und fallen nicht in den Anwendungsbereich dieses Musters.

Automatisierung und Skalierung

Sie können die Bereitstellung von Amazon Cognito Cognito-Benutzerpools, AWS Lambda Funktionen, Datenbank-Instances und anderen Ressourcen automatisieren AWS CloudFormation, indem Sie das AWS Cloud Development Kit (AWS CDK) HashiCorp Terraform - oder ein anderes unterstütztes Infrastructure-as-Code-Tool (IaC) verwenden. Wenn Sie Ihre Bereitstellungen skalieren möchten, verwenden Sie CI/CD-Pipelines (Continuous Integration and Continuous Delivery), um Fehler im Zusammenhang mit manuellen Bereitstellungen zu vermeiden.

Tools

AWS-Services

  • Amazon API Gateway unterstützt Sie bei der Erstellung, Veröffentlichung, Wartung, Überwachung und Sicherung von REST, HTTP und WebSocket APIs in jeder Größenordnung.

  • Amazon Cognito bietet Authentifizierung, Autorisierung und Benutzerverwaltung für Web- und mobile Apps.

  • Amazon Elastic Container Service (Amazon ECS) ist ein hoch skalierbarer, schneller Container-Management-Service, der das Ausführen, Beenden und Verwalten von Containern in einem Cluster vereinfacht.

  • AWS Lambda ist ein Datenverarbeitungsservice, mit dem Sie Code ausführen können, ohne dass Sie Server bereitstellen oder verwalten müssen. Es führt Ihren Code nur bei Bedarf aus und skaliert automatisch, sodass Sie nur für die tatsächlich genutzte Rechenzeit zahlen.

  • AWS SDK für JavaScriptbietet eine JavaScript API für AWS-Services. Sie können damit Bibliotheken oder Anwendungen für Node.js oder den Browser erstellen.

Andere Tools

  • Node.js ist eine ereignisgesteuerte JavaScript Laufzeitumgebung, die für die Erstellung skalierbarer Netzwerkanwendungen konzipiert ist.

  • npm ist eine Softwareregistrierung, die in einer Node.js -Umgebung ausgeführt wird und verwendet wird, um Pakete gemeinsam zu nutzen oder auszuleihen und die Bereitstellung von privaten Paketen zu verwalten.

Bewährte Methoden

Wir empfehlen Ihnen, die folgenden bewährten Methoden zu implementieren:

  • Geheimnisse und sensible Daten — Speichern Sie keine Geheimnisse oder vertraulichen Daten innerhalb der Anwendung. Verwenden Sie ein externes System, aus dem die Anwendung die Daten abrufen kann AWS AppConfig, z. B. AWS Secrets Manager, oder AWS Systems Manager Parameter Store.

  • Standardisierte Bereitstellung — Verwenden Sie CI/CD Pipelines, um Ihre Anwendungen bereitzustellen. Sie können Dienste wie AWS CodeBuildund AWS CodePipelineverwenden.

  • Ablauf des Tokens — Legen Sie ein kurzes Ablaufdatum für das Zugriffstoken fest.

  • Verwenden Sie eine sichere Verbindung — Die gesamte Kommunikation zwischen der Client-Anwendung und dem Backend sollte mit SSL/TLS verschlüsselt werden. Verwenden Sie AWS Certificate Manager (ACM), um SSL/TLS Zertifikate zu generieren und zu verwalten, und verwenden Sie Amazon CloudFront oder Elastic Load Balancing, um die SSL/TLS Kündigung abzuwickeln.

  • Benutzereingaben validieren — Stellen Sie sicher, dass alle Benutzereingaben validiert werden, um Injection-Angriffe und andere Sicherheitslücken zu verhindern. Verwenden Sie Bibliotheken und Dienste zur Eingabevalidierung wie Amazon API Gateway, AWS WAFum gängige Angriffsvektoren zu verhindern.

  • Verwenden Sie IAM-Rollen — Verwenden Sie AWS Identity and Access Management (IAM-) Rollen, um den Zugriff auf AWS Ressourcen zu kontrollieren und sicherzustellen, dass nur autorisierte Benutzer Zugriff haben. Folgen Sie dem Prinzip der geringsten Rechte und stellen Sie sicher, dass jeder Benutzer nur über die erforderlichen Berechtigungen verfügt, um seine Rolle auszuführen.

  • Verwenden Sie eine Kennwortrichtlinie — Konfigurieren Sie eine Kennwortrichtlinie, die Ihren Sicherheitsanforderungen wie Mindestlänge, Komplexität und Ablauf entspricht. Verwenden Sie Secrets Manager oder AWS Systems Manager Parameter Store, um Passwörter sicher zu speichern und zu verwalten.

  • Multi-Faktor-Authentifizierung (MFA) aktivieren — Aktivieren Sie MFA für alle Benutzer, um eine zusätzliche Sicherheitsebene bereitzustellen und das Risiko eines unbefugten Zugriffs zu verringern. Verwenden Sie AWS IAM Identity Centeroder Amazon Cognito, um MFA und andere Authentifizierungsmethoden zu aktivieren.

  • Vertrauliche Informationen sicher speichern — Speichern Sie vertrauliche Informationen wie Passwörter und Zugriffstoken sicher, indem Sie AWS Key Management Service (AWS KMS) oder andere Verschlüsselungsdienste verwenden.

  • Verwenden Sie starke Authentifizierungsmethoden — Verwenden Sie starke Authentifizierungsmethoden wie biometrische Authentifizierung oder Multi-Faktor-Authentifizierung, um die Sicherheit des Authentifizierungsprozesses zu erhöhen.

  • Überwachung auf verdächtige Aktivitäten — Verwenden Sie AWS CloudTrailund andere Überwachungstools, um verdächtige Aktivitäten und potenzielle Sicherheitsbedrohungen zu überwachen. Richten Sie automatische Benachrichtigungen für ungewöhnliche Aktivitäten ein und nutzen Sie Amazon GuardDuty oder, AWS Security Hubum potenzielle Bedrohungen zu erkennen.

  • Regelmäßige Überprüfung und Aktualisierung der Sicherheitsrichtlinien — Überprüfen und aktualisieren Sie Ihre Sicherheitsrichtlinien und -verfahren regelmäßig, um sicherzustellen, dass sie Ihren sich ändernden Sicherheitsanforderungen und bewährten Verfahren entsprechen. Verwenden Sie diese Option AWS Config , um Änderungen an Ihren Sicherheitsrichtlinien und -verfahren nachzuverfolgen und zu überprüfen.

  • Automatisierte Anmeldung — Aktivieren Sie nicht die automatische Anmeldung bei einem Amazon Cognito Cognito-Benutzerpool. Weitere Informationen finden Sie unter Reduzieren Sie das Risiko von Benutzerregistrierungsbetrug und SMS-Pumping mit Amazon Cognito Cognito-Benutzerpools (AWS Blogbeitrag).

Weitere bewährte Methoden finden Sie unter Bewährte Sicherheitsmethoden für Amazon Cognito Cognito-Benutzerpools in der Amazon Cognito Cognito-Dokumentation.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie einen Benutzerpool.

  1. Geben Sie in einem CLI-Terminal den folgenden Befehl ein, um einen Amazon Cognito Cognito-Benutzerpool zu erstellen:

    aws cognito-idp create-user-pool \ --pool-name <MyUserPool>
  2. Geben Sie den folgenden Befehl ein, um eine Client-ID und einen geheimen Schlüssel zu erstellen, die zusammen mit dem SDK verwendet werden für 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"

Weitere Informationen und Anweisungen zum Einrichten eines Benutzerpools in finden Sie unter Erste Schritte mit Benutzerpools und Hinzufügen weiterer Funktionen und Sicherheitsoptionen zu Ihrem Benutzerpool. AWS Management Console

Tipp

Testen Sie dieses Muster mit dem Essentials-Plan oder dem Lite-Plan, um die Kosten zu senken. Weitere Informationen finden Sie unter Amazon Cognito Cognito-Preise.

App-Entwickler, AWS DevOps

Fügen Sie dem Benutzerpool einen Benutzer hinzu.

Geben Sie den folgenden Befehl ein, um einen Benutzer im Amazon Cognito Cognito-Benutzerpool zu erstellen:

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>"
App-Entwickler, AWS DevOps

Fügen Sie den App-Client dem Benutzerpool hinzu.

  1. Navigieren Sie zur Amazon-Cognito-Konsole.

  2. Klicken Sie auf User pools (Benutzerpools).

  3. Wählen Sie den Benutzerpool aus, den Sie zuvor erstellt haben.

  4. Wählen Sie unter Anwendung definieren den Anwendungstyp aus, der am besten zu dem Anwendungsszenario passt, für das Sie Authentifizierungs- und Autorisierungsdienste erstellen möchten.

  5. Geben Sie im Feld Benennen Sie Ihre Anwendung einen aussagekräftigen Namen ein, oder fahren Sie mit dem Standardnamen fort.

  6. Geben Sie unter Rückgabe-URL hinzufügen einen Weiterleitungspfad zu Ihrer Anwendung ein, der nach Abschluss der Benutzerauthentifizierung verfügbar ist.

  7. Wählen Sie Create your application aus. Sie können die erweiterten Optionen einrichten, nachdem Sie Ihren App-Client erstellt haben.

AWS-Systemadministrator, AWS-Administrator, AWS DevOps, App-Entwickler

Erstellen Sie einen Lambda-Trigger für die Pre-Token-Generierung.

  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie Funktion erstellen.

  3. Wählen Sie Verfassen von Grund auf aus.

  4. Geben Sie im Bereich Grundinformationen als Funktionsname den Wert ein. myPreTokenGenerationLambdaFunction

  5. Wählen Sie für Runtime Node.js 22.

  6. Lassen Sie die Architektur auf x86_64 eingestellt.

  7. Wählen Sie Funktion erstellen.

  8. Geben Sie auf der Registerkarte Code unter Codequelle die Lambda-Beispielfunktion aus dem Abschnitt Zusätzliche Ressourcen dieses Musters ein. Diese Lambda-Funktion fügt die benutzerdefinierten Attribute in das ID-Token und das Zugriffstoken ein.

AWS DevOps, App-Entwickler

Passen Sie den Benutzerpool-Workflow an.

  1. Navigieren Sie zur Amazon-Cognito-Konsole.

  2. Klicken Sie auf User pools (Benutzerpools).

  3. Wählen Sie den Benutzerpool aus, den Sie zuvor erstellt haben.

  4. Wählen Sie im linken Navigationsbereich unter Authentifizierung die Option Erweiterungen aus.

  5. Wählen Sie Lambda-Trigger hinzufügen.

  6. Fügen Sie einen Trigger für die Pre-Token-Generierung hinzu oder bearbeiten Sie ihn.

  7. Wählen Sie als Triggertyp die Option Authentifizierung aus.

  8. Wählen Sie unter Authentifizierung die Option Trigger vor der Token-Generierung aus.

  9. Wählen Sie für die Funktion „Lambda zuweisen“ die OptionmyPreTokenGenerationLambdaFunction.

  10. Wählen Sie Lambda-Trigger hinzufügen.

  11. Wählen Sie eine Trigger-Event-Version von Basisfunktionen + Anpassung des Zugriffstokens für Benutzeridentitäten oder Grundfunktionen + Anpassung des Zugriffstokens für Benutzer- und Maschinenidentitäten. Diese Einstellung aktualisiert die Anforderungsparameter, die Amazon Cognito an Ihre Funktion sendet, damit sie Felder für die Anpassung von Zugriffs-Token enthalten.

Weitere Informationen finden Sie unter Anpassen von Benutzerpool-Workflows mit Lambda-Triggern in der Amazon Cognito Cognito-Dokumentation.

AWS DevOps, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie die Anwendung Node.js.

  1. Geben Sie in einem Terminal die folgenden Befehle ein:

    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. Ändern Sie die package.json Datei so, dass sie die TypeScript Kompilierungsskripten enthält:

    "scripts": { "start": "node src/index.js", "build": "tsc" },
App-Developer

Implementieren Sie die Authentifizierungslogik.

  1. Öffnen Sie die index.ts Datei.

  2. Fügen Sie das Typescript-Beispiel ein, das im Abschnitt Zusätzliche Ressourcen dieses Musters bereitgestellt wird.

  3. Speichern und schließen Sie die Datei index.ts.

Anmerkung

Sie können Ihre eigene TypeScript Datei erstellen oder das bereitgestellte Beispiel nach Bedarf für Ihren Anwendungsfall ändern.

App-Developer

Konfigurieren Sie die Umgebungsvariablen und die Konfigurationsdatei.

Geben Sie in einem Terminal die folgenden Befehle ein, um die Umgebungsvariablen zu erstellen:

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

Codieren Sie keine Geheimnisse fest und geben Sie Ihre Anmeldeinformationen nicht preis.

App-Developer

Führen Sie die Anwendung aus.

Geben Sie die folgenden Befehle ein, um die Anwendung auszuführen und zu bestätigen, dass sie funktioniert:

npm run build npm start
App-Developer

Vergewissern Sie sich, dass die benutzerdefinierten Attribute in die Token eingefügt wurden.

Verwenden Sie die Debugging-Funktionen für Ihre IDE, um die Zugriffs- und ID-Token anzuzeigen. Vergewissern Sie sich, dass die benutzerdefinierten Attribute hinzugefügt wurden. Beispiel-Token finden Sie im Abschnitt Zusätzliche Informationen dieses Musters.

App-Developer

Fehlerbehebung

ProblemLösung

Ungültige Client-ID beim Versuch, den Benutzer zu authentifizieren

Dieser Fehler tritt normalerweise auf, wenn Sie eine Client-ID mit einem generierten geheimen Client-Schlüssel verwenden. Sie müssen eine Client-ID erstellen, der kein Geheimnis zugeordnet ist. Weitere Informationen finden Sie unter Anwendungsspezifische Einstellungen mit App-Clients.

Zugehörige Ressourcen

Zusätzliche Informationen

TypeScript Beispieldatei

Das folgende Codebeispiel ist eine TypeScript Datei, die den Authentifizierungsprozess mithilfe eines AWS SDK aufruft, um benutzerdefinierte Attribute an Amazon Cognito zu senden:

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 ?? '');

Das Beispiel verwendet das AuthenticationDetails Modell aus dem SDK für, JavaScript um den Benutzernamen, das Passwort und die bereitzustellen. ClientMetadada Nach der Authentifizierung in Amazon Cognito können die Client-Metadaten aus den Zugriffs- und ID-Token abgerufen werden.

Beispiel-Lambda-Funktion

Das folgende Codebeispiel ist eine Lambda-Funktion, die mit dem Pre-Generation-Token von Amazon Cognito verknüpft ist. Es hilft Ihnen, das Zugriffstoken und das ID-Token, die Amazon Cognito verwendet, anzupassen. Die Token werden durch die Integrationen zwischen Ihrer Architektur weitergegeben. Dieses Beispiel enthält ein benutzerdefiniertes Anspruchsattribut mit dem Namen customApplicationData und einen benutzerdefinierten Gruppennamen namensMyCustomGroup:

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); };

Beispiel für ein Zugriffstoken

Sie können das Zugriffstoken dekodieren, um die hinzugefügten benutzerdefinierten Attribute zu visualisieren. Im Folgenden finden Sie ein Beispiel für ein Zugriffstoken:

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

Beispiel für ein ID-Token

Sie können das Zugriffstoken dekodieren, um die hinzugefügten benutzerdefinierten Attribute zu visualisieren. Im Folgenden finden Sie ein Beispiel für ein Zugriffstoken:

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