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
Ein aktiver AWS-Konto
Berechtigungen zum Erstellen und Verwalten von Amazon Cognito Cognito-Benutzerpools und AWS Lambda -funktionen
AWS Command Line Interface (AWS CLI), installiert und konfiguriert
Eine integrierte Entwicklungsumgebung (IDE), die Node.js unterstützt
Node.js Version 18 oder höher, installiert
TypeScript, installiert
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.

Das Diagramm zeigt den folgenden Workflow:
Die Anwendung Node.js gibt ein Zugriffstoken mit benutzerdefinierten Attributen für den Amazon Cognito Cognito-Benutzerpool aus.
Der Amazon Cognito Cognito-Benutzerpool initiiert die Lambda-Funktion vor der Token-Generierung, mit der die Zugriffs- und ID-Token angepasst werden.
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
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
| Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
|---|---|---|
Erstellen Sie einen Benutzerpool. |
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 TippTesten 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:
| App-Entwickler, AWS DevOps |
Fügen Sie den App-Client dem Benutzerpool hinzu. |
| AWS-Systemadministrator, AWS-Administrator, AWS DevOps, App-Entwickler |
Erstellen Sie einen Lambda-Trigger für die Pre-Token-Generierung. |
| AWS DevOps, App-Entwickler |
Passen Sie den Benutzerpool-Workflow an. |
Weitere Informationen finden Sie unter Anpassen von Benutzerpool-Workflows mit Lambda-Triggern in der Amazon Cognito Cognito-Dokumentation. | AWS DevOps, App-Entwickler |
| Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
|---|---|---|
Erstellen Sie die Anwendung Node.js. |
| App-Developer |
Implementieren Sie die Authentifizierungslogik. |
AnmerkungSie 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:
WichtigCodieren 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:
| 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
| Problem | Lö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
Anpassen von Benutzerpool-Workflows mit Lambda-Triggern (Amazon Cognito Cognito-Dokumentation)
Lambda-Trigger vor der Token-Generierung (Amazon Cognito Cognito-Dokumentation)
CognitoIdentityProviderClient(Dokumentation)AWS SDK für JavaScript
cognito-idp
(Dokumentation)AWS CLI
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>" }