View a markdown version of this page

Developer-authenticated Identitäten - Amazon Cognito

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.

Developer-authenticated Identitäten

Amazon Cognito unterstützt entwicklerauthentifizierte Identitäten zusätzlich zum Web-Identitätsverbund über Facebook als Identitätspools einrichten (IdP), Google als Identitätspool-IdP einrichten, Login with Amazon als Identitätspools (IdP) einrichten und Mit Apple anmelden als Identitätspool-IdP einrichten. Mit von Entwicklern authentifizierten Identitäten können Sie Benutzer über Ihren eigenen bestehenden Authentifizierungsprozess registrieren und authentifizieren und gleichzeitig Amazon Cognito verwenden, um Benutzerdaten zu synchronisieren und auf Ressourcen zuzugreifen. AWS Die Verwendung von entwicklerauthentifizierten Identitäten beinhaltet die Interaktion zwischen dem Endbenutzergerät, Ihrem Backend für die Authentifizierung und Amazon Cognito. Weitere Informationen finden Sie im Blog unter Grundlegendes zur Amazon Cognito-Authentifizierung, Teil 2: Authentifizierte Identitäten von Entwicklern. AWS

Erläuterungen zum Authentifizierungsfluss

Der GetOpenIdTokenForDeveloperIdentity API-Vorgang kann die Entwicklerauthentifizierung sowohl für die erweiterte als auch für die Standardauthentifizierung initiieren. Diese API authentifiziert eine Anfrage mit administrativen Anmeldeinformationen. Bei der Logins Map handelt es sich um den Namen eines Entwicklers und Anbieters für login.mydevprovider Identitätspools, gepaart mit einer benutzerdefinierten Kennung.

Beispiel:

"Logins": { "login.mydevprovider": "my developer identifier" }

Verbesserte Authentifizierung

Rufen Sie die GetCredentialsForIdentity API-Operation mit einer Logins Map auf, bei der der Schlüssel der Aussteller des von GetOpenIdTokenForDeveloperIdentity zurückgegebenen Tokens ist und der Wert das Token selbst ist.

Der Aussteller (und damit der erforderliche Anmeldeschlüssel) hängt von der Region Ihres Identitätspools ab. Die Aussteller des Tokens nach Region vollständige Liste der Regionen und ihrer Token-Emittenten finden Sie unter.

Beispiel für einen Identitätspool in einer Region, der den globalen Emittenten verwendet:

"Logins": { "cognito-identity.amazonaws.com": "eyJra12345EXAMPLE" }

Beispiel für einen Identitätspool in einer neueren Region (wie eu-south-2):

"Logins": { "cognito-identity.eu-south-2.amazonaws.com": "eyJra12345EXAMPLE" }
Wichtig

Der Login-Zuordnungsschlüssel muss exakt mit dem iss (Aussteller-) Anspruch im Token übereinstimmen. Wenn sie nicht übereinstimmen, GetCredentialsForIdentity wird Folgendes zurückgegeben: NotAuthorizedException: Invalid login token. Issuer doesn't match providerName

Tipp

Um den richtigen Anmeldeschlüssel programmgesteuert zu ermitteln, dekodieren Sie das Token (ein JWT) und lesen Sie den Claim-Wert. iss Verwenden Sie diesen Wert als Login-Zuordnungsschlüssel.

GetCredentialsForIdentitywith developer-authenticated identities gibt temporäre Anmeldeinformationen für die authentifizierte Standardrolle des Identitätspools zurück.

Grundlegende Authentifizierung

Rufen Sie den AssumeRoleWithWebIdentity API-Vorgang auf und fordern Sie den für jede IAM-Rolle RoleArn an, für die eine entsprechende Vertrauensbeziehung definiert ist. Vertrauensstellungen und Berechtigungen für Rollen Stellen Sie den Wert von WebIdentityToken auf das Token ein, das Sie von GetOpenIdTokenForDeveloperIdentity erhalten haben.

Informationen zum Authflow für von Entwicklern authentifizierte Identitäten und wie sie sich von Identitäten externer Anbieter unterscheiden, finden Sie unter. Identitäten-Pools – Authentifzierungsablauf

Definieren eines Entwickleranbieternamens und Zuordnen zu einem Identitäten-Pool

Zur Verwendung von entwicklerauthentifizierten Identitäten muss dem Entwickleranbieter ein Identitätspool zugeordnet werden. Führen Sie dazu die folgenden Schritte aus:

So fügen Sie einen benutzerdefinierten Entwickleranbieter hinzu
  1. Wählen Sie Identitätspools in der Amazon-Cognito-Konsole aus. Wählen Sie einen Identitätspool.

  2. Wählen Sie die Registerkarte Datenzugriff aus.

  3. Wählen Sie Identitätsanbieter hinzufügen aus.

  4. Wählen Sie Benutzerdefinierter Entwickleranbieter aus.

  5. Geben Sie einen Namen für den Entwickleranbieter ein. Wenn Sie Ihren Entwickleranbieter eingegeben haben, können Sie ihn nicht mehr ändern oder löschen.

  6. Wählen Sie Änderungen speichern aus.

Hinweis: Sobald der Anbieternamen festgelegt wurde, kann er nicht mehr geändert werden.

Implementieren eines Identitätsanbieters

Android

Zur Verwendung von entwicklerauthentifizierten Identitäten implementieren Sie eine eigene Identitätsanbieterklasse, die AWSAbstractCognitoIdentityProvider erweitert. Die Identitätsanbieterklasse sollte ein Antwortobjekt zurückgeben, das das Token als Attribut enthält.

Es folgt ein einfaches Beispiel für einen Identitätsanbieter.

public class DeveloperAuthenticationProvider extends AWSAbstractCognitoDeveloperIdentityProvider { private static final String developerProvider = "<Developer_provider_name>"; public DeveloperAuthenticationProvider(String accountId, String identityPoolId, Regions region) { super(accountId, identityPoolId, region); // Initialize any other objects needed here. } // Return the developer provider name which you choose while setting up the // identity pool in the &COG; Console @Override public String getProviderName() { return developerProvider; } // Use the refresh method to communicate with your backend to get an // identityId and token. @Override public String refresh() { // Override the existing token setToken(null); // Get the identityId and token by making a call to your backend // (Call to your backend) // Call the update method with updated identityId and token to make sure // these are ready to be used from Credentials Provider. update(identityId, token); return token; } // If the app has a valid identityId return it, otherwise get a valid // identityId from your backend. @Override public String getIdentityId() { // Load the identityId from the cache identityId = cachedIdentityId; if (identityId == null) { // Call to your backend } else { return identityId; } } }

Zur Verwendung dieses Anbieters müssen Sie ihn an übergeben CognitoCachingCredentialsProvider. Ein Beispiel:

DeveloperAuthenticationProvider developerProvider = new DeveloperAuthenticationProvider( null, "IDENTITYPOOLID", context, Regions.USEAST1); CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( context, developerProvider, Regions.USEAST1);
Anmerkung

Ältere Versionen des AWS SDK für Android (2.x und früher) verwenden den internen Anbieternamen für vom Entwickler authentifizierte Identitäten. cognito-identity.amazonaws.com Wenn sich Ihr Identitätspool in einer neueren Region befindet, die einen regionalisierten Aussteller verwendet, führen Sie ein Upgrade auf eine aktuelle SDK-Version durch. Weitere Informationen finden Sie unter Format des regionalen Token-Ausstellers.

iOS – Objective-C

Zur Verwendung von entwicklerauthentifizierten Identitäten implementieren Sie eine eigene Identitätsanbieterklasse, die AWSCognitoCredentialsProviderHelper erweitert. Die Identitätsanbieterklasse sollte ein Antwortobjekt zurückgeben, das das Token als Attribut enthält.

@implementation DeveloperAuthenticatedIdentityProvider /* * Use the token method to communicate with your backend to get an * identityId and token. */ - (AWSTask <NSString*> *) token { //Write code to call your backend: //Pass username/password to backend or some sort of token to authenticate user //If successful, from backend call getOpenIdTokenForDeveloperIdentity with logins map //containing "your.provider.name":"enduser.username" //Return the identity id and token to client //You can use AWSTaskCompletionSource to do this asynchronously // Set the identity id and return the token self.identityId = response.identityId; return [AWSTask taskWithResult:response.token]; } @end

Zur Verwendung dieses Identitätsanbieters müssen Sie ihn wie in folgendem Beispiel gezeigt an AWSCognitoCredentialsProvider übergeben:

DeveloperAuthenticatedIdentityProvider * devAuth = [[DeveloperAuthenticatedIdentityProvider alloc] initWithRegionType:AWSRegionYOUR_IDENTITY_POOL_REGION identityPoolId:@"YOUR_IDENTITY_POOL_ID" useEnhancedFlow:YES identityProviderManager:nil]; AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionYOUR_IDENTITY_POOL_REGION identityProvider:devAuth];

Wenn Sie sowohl nicht authentifizierte Identitäten als auch entwicklerauthentifizierte Identitäten unterstützen möchten, überschreiben Sie die Methode logins in der AWSCognitoCredentialsProviderHelper-Implementierung.

- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins { if(/*logic to determine if user is unauthenticated*/) { return [AWSTask taskWithResult:nil]; }else{ return [super logins]; } }

Wenn Sie sowohl entwicklerauthentifizierte Identitäten als auch Social-Identity-Anbieter unterstützen möchten, müssen Sie den verwendeten aktuellen Anbieter in der logins-Implementierung von AWSCognitoCredentialsProviderHelper verwalten.

- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins { if(/*logic to determine if user is unauthenticated*/) { return [AWSTask taskWithResult:nil]; }else if (/*logic to determine if user is Facebook*/){ return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : [FBSDKAccessToken currentAccessToken] }]; }else { return [super logins]; } }
Anmerkung

Ältere Versionen des AWS SDK für iOS (2.x und früher) verwenden cognito-identity.amazonaws.com den internen Anbieternamen für vom Entwickler authentifizierte Identitäten. Wenn sich Ihr Identitätspool in einer neueren Region befindet, die einen regionalisierten Aussteller verwendet, führen Sie ein Upgrade auf eine aktuelle SDK-Version durch. Weitere Informationen finden Sie unter Format des regionalen Token-Ausstellers.

iOS – Swift

Zur Verwendung von entwicklerauthentifizierten Identitäten implementieren Sie eine eigene Identitätsanbieterklasse, die AWSCognitoCredentialsProviderHelper erweitert. Die Identitätsanbieterklasse sollte ein Antwortobjekt zurückgeben, das das Token als Attribut enthält.

import AWSCore /* * Use the token method to communicate with your backend to get an * identityId and token. */ class DeveloperAuthenticatedIdentityProvider : AWSCognitoCredentialsProviderHelper { override func token() -> AWSTask<NSString> { //Write code to call your backend: //pass username/password to backend or some sort of token to authenticate user, if successful, //from backend call getOpenIdTokenForDeveloperIdentity with logins map containing "your.provider.name":"enduser.username" //return the identity id and token to client //You can use AWSTaskCompletionSource to do this asynchronously // Set the identity id and return the token self.identityId = resultFromAbove.identityId return AWSTask(result: resultFromAbove.token) }

Zur Verwendung dieses Identitätsanbieters müssen Sie ihn wie in folgendem Beispiel gezeigt an AWSCognitoCredentialsProvider übergeben:

let devAuth = DeveloperAuthenticatedIdentityProvider(regionType: .YOUR_IDENTITY_POOL_REGION, identityPoolId: "YOUR_IDENTITY_POOL_ID", useEnhancedFlow: true, identityProviderManager:nil) let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .YOUR_IDENTITY_POOL_REGION, identityProvider:devAuth) let configuration = AWSServiceConfiguration(region: .YOUR_IDENTITY_POOL_REGION, credentialsProvider:credentialsProvider) AWSServiceManager.default().defaultServiceConfiguration = configuration

Wenn Sie sowohl nicht authentifizierte Identitäten als auch entwicklerauthentifizierte Identitäten unterstützen möchten, überschreiben Sie die Methode logins in der AWSCognitoCredentialsProviderHelper-Implementierung.

override func logins () -> AWSTask<NSDictionary> { if(/*logic to determine if user is unauthenticated*/) { return AWSTask(result:nil) }else { return super.logins() } }

Wenn Sie sowohl entwicklerauthentifizierte Identitäten als auch Social-Identity-Anbieter unterstützen möchten, müssen Sie den verwendeten aktuellen Anbieter in der logins-Implementierung von AWSCognitoCredentialsProviderHelper verwalten.

override func logins () -> AWSTask<NSDictionary> { if(/*logic to determine if user is unauthenticated*/) { return AWSTask(result:nil) }else if (/*logic to determine if user is Facebook*/){ if let token = AccessToken.current?.authenticationToken { return AWSTask(result: [AWSIdentityProviderFacebook:token]) } return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"])) }else { return super.logins() } }

JavaScript

Nachdem Sie eine Identitäts-ID und ein Sitzungs-Token von Ihrem Backend erhalten haben, übergeben Sie diese an den AWS.CognitoIdentityCredentials-Anbieter. Der Anmeldeschlüssel muss dem Anspruch des Tokens entsprechen. iss Für Identitätspools in Regionen, die den globalen Aussteller verwenden, verwenden Sie. cognito-identity.amazonaws.com Für Identitätspools in anderen Regionen verwenden Siecognito-identity.region.amazonaws.com. Weitere Informationen finden Sie unter Format des regionalen Token-Ausstellers.

const token = 'TOKEN_RETURNED_FROM_YOUR_PROVIDER'; // Extract the issuer from the token const payload = token.split('.')[1]; const claims = JSON.parse(Buffer.from(payload, 'base64url').toString()); const providerName = claims.iss; AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'IDENTITY_POOL_ID', IdentityId: 'IDENTITY_ID_RETURNED_FROM_YOUR_PROVIDER', Logins: { [providerName]: token } });

Unity

Zur Verwendung von entwicklerauthentifizierten Identitäten müssen Sie CognitoAWSCredentials erweitern und die Methode RefreshIdentity überschreiben, um die Benutzeridentitäts-ID und das Token vom Backend abzurufen und zurückzugeben. Nachstehend finden Sie ein einfaches Beispiel für einen Identitätsanbieter, der ein hypothetisches Backend unter „example.com“ kontaktiert:

using UnityEngine; using System.Collections; using Amazon.CognitoIdentity; using System.Collections.Generic; using ThirdParty.Json.LitJson; using System; using System.Threading; public class DeveloperAuthenticatedCredentials : CognitoAWSCredentials { const string PROVIDER_NAME = "example.com"; const string IDENTITY_POOL = "IDENTITY_POOL_ID"; static readonly RegionEndpoint REGION = RegionEndpoint.USEast1; private string login = null; public DeveloperAuthenticatedCredentials(string loginAlias) : base(IDENTITY_POOL, REGION) { login = loginAlias; } protected override IdentityState RefreshIdentity() { IdentityState state = null; ManualResetEvent waitLock = new ManualResetEvent(false); MainThreadDispatcher.ExecuteCoroutineOnMainThread(ContactProvider((s) => { state = s; waitLock.Set(); })); waitLock.WaitOne(); return state; } IEnumerator ContactProvider(Action<IdentityState> callback) { WWW www = new WWW("http://example.com/?username="+login); yield return www; string response = www.text; JsonData json = JsonMapper.ToObject(response); //The backend has to send us back an Identity and a OpenID token string identityId = json["IdentityId"].ToString(); string token = json["Token"].ToString(); IdentityState state = new IdentityState(identityId, PROVIDER_NAME, token, false); callback(state); } }

Der obige Code verwendet ein Thread-Dispatcher-Objekt zum Aufrufen einer Coroutine. Wenn Sie in Ihrem Projekt nicht die Möglichkeit dazu haben, können Sie das folgende Skript in Ihren Szenen verwenden:

using System; using UnityEngine; using System.Collections; using System.Collections.Generic; public class MainThreadDispatcher : MonoBehaviour { static Queue<IEnumerator> _coroutineQueue = new Queue<IEnumerator>(); static object _lock = new object(); public void Update() { while (_coroutineQueue.Count > 0) { StartCoroutine(_coroutineQueue.Dequeue()); } } public static void ExecuteCoroutineOnMainThread(IEnumerator coroutine) { lock (_lock) { _coroutineQueue.Enqueue(coroutine); } } }

Xamarin

Zur Verwendung von entwicklerauthentifizierten Identitäten müssen Sie CognitoAWSCredentials erweitern und die Methode RefreshIdentity überschreiben, um die Benutzeridentitäts-ID und das Token vom Backend abzurufen und zurückzugeben. Nachstehend finden Sie ein einfaches Beispiel für einen Identitätsanbieter, der ein hypothetisches Backend unter „example.com“ kontaktiert:

public class DeveloperAuthenticatedCredentials : CognitoAWSCredentials { const string PROVIDER_NAME = "example.com"; const string IDENTITY_POOL = "IDENTITY_POOL_ID"; static readonly RegionEndpoint REGION = RegionEndpoint.USEast1; private string login = null; public DeveloperAuthenticatedCredentials(string loginAlias) : base(IDENTITY_POOL, REGION) { login = loginAlias; } protected override async Task<IdentityState> RefreshIdentityAsync() { IdentityState state = null; //get your identity and set the state return state; } }

Aktualisieren der Anmeldezuweisung (nur Android und iOS)

Android

Nach erfolgreicher Authentifizierung des Benutzers mit Ihrem Authentifizierungssystem aktualisieren Sie die Anmeldezuweisung mit dem Entwickleranbieter-Namen und einer Entwicklerbenutzer-ID. Dies ist eine alphanumerische Zeichenfolge, die einen Benutzer in Ihrem Authentifizierungssystem eindeutig identifiziert. Stellen Sie sicher, dass nach der Aktualisierung der Anmeldezuweisung die Methode refresh da die identityId sich möglicherweise geändert hat:

HashMap<String, String> loginsMap = new HashMap<String, String>(); loginsMap.put(developerAuthenticationProvider.getProviderName(), developerUserIdentifier); credentialsProvider.setLogins(loginsMap); credentialsProvider.refresh();

iOS – Objective-C

Das iOS-SDK ruft die Methode logins nur auf, um die aktuelle Anmeldezuweisung abzurufen, wenn keine Anmeldeinformationen vorliegen oder diese abgelaufen sind. Wenn Sie das Abrufen neuer Anmeldeinformationen im SDK erzwingen möchten (weil beispielsweise ein nicht authentifizierter Endbenutzer jetzt authentifiziert ist und Sie Anmeldeinformationen für den authentifizierten Benutzer benötigen), rufen Sie clearCredentials in credentialsProvider auf.

[credentialsProvider clearCredentials];

iOS – Swift

Das iOS-SDK ruft die Methode logins nur auf, um die aktuelle Anmeldezuweisung abzurufen, wenn keine Anmeldeinformationen vorliegen oder diese abgelaufen sind. Wenn Sie das Abrufen neuer Anmeldeinformationen im SDK erzwingen möchten (weil beispielsweise ein nicht authentifizierter Endbenutzer jetzt authentifiziert ist und Sie Anmeldeinformationen für den authentifizierten Benutzer benötigen), rufen Sie clearCredentials in credentialsProvider auf.

credentialsProvider.clearCredentials()

Aufrufen eines Tokens (Serverseite)

Sie erhalten ein Token, indem Sie anrufen GetOpenIdTokenForDeveloperIdentity. Diese API muss von Ihrem Backend aus mit den Anmeldeinformationen des AWS Entwicklers aufgerufen werden. Sie darf nicht über das Client-SDK aufgerufen werden. Die API empfängt die Cognito-Identitätspool-ID, eine Anmeldezuweisung mit Ihrem Identitätsanbieter-Namen als Schlüssel und der ID als Wert sowie optional eine Cognito-Identitäts-ID (d. h. Sie ändern einen nicht authentifizierten in einen authentifizierten Benutzer). Die ID kann der Benutzername Ihres Benutzers, eine E-Mail-Adresse oder ein numerischer Wert sein. Die API beantwortet den Aufruf mit einer eindeutigen Cognito-ID für Ihren Benutzer und einem OpenID Connect-Token für den Endbenutzer.

Im Folgenden noch einige Hinweise zu dem durch zurückgegebenen Token GetOpenIdTokenForDeveloperIdentity:

  • Sie können eine benutzerdefinierte Ablaufzeit für das Token angeben, sodass Sie es zwischenspeichern können. Wenn Sie keine benutzerdefinierte Ablaufzeit bereitstellen, ist das Token für 15 Minuten gültig.

  • Die maximale Token-Dauer, die Sie festlegen können, ist 24 Stunden.

  • Beachten Sie, dass eine Verlängerung der Token-Dauer zu Sicherheitsproblemen führen kann. Wenn ein Angreifer dieses Token erhält, kann er es für die Dauer des Tokens gegen AWS Anmeldeinformationen für den Endbenutzer eintauschen.

Der folgende Java-Codeausschnitt zeigt, wie Sie einen Amazon-Cognito-Client initiieren und ein Token für eine entwicklerauthentifizierte Identität abrufen.

// authenticate your end user as appropriate // .... // if authenticated, initialize a cognito client with your AWS developer credentials AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient( new BasicAWSCredentials("access_key_id", "secret_access_key") ); // create a new request to retrieve the token for your end user GetOpenIdTokenForDeveloperIdentityRequest request = new GetOpenIdTokenForDeveloperIdentityRequest(); request.setIdentityPoolId("YOUR_COGNITO_IDENTITY_POOL_ID"); request.setIdentityId("YOUR_COGNITO_IDENTITY_ID"); //optional, set this if your client has an //identity ID that you want to link to this //developer account // set up your logins map with the username of your end user HashMap<String,String> logins = new HashMap<>(); logins.put("YOUR_IDENTITY_PROVIDER_NAME","YOUR_END_USER_IDENTIFIER"); request.setLogins(logins); // optionally set token duration (in seconds) request.setTokenDuration(60 * 15l); GetOpenIdTokenForDeveloperIdentityResult response = identityClient.getOpenIdTokenForDeveloperIdentity(request); // obtain identity id and token to return to your client String identityId = response.getIdentityId(); String token = response.getToken(); //code to return identity id and token to client //...

Nach den oben aufgeführten Schritten können Sie entwicklerauthentifizierte Identitäten in Ihre App integrieren. Bei Problemen oder Fragen können Sie gerne einen Beitrag in unseren Foren posten.

Format des regionalen Token-Ausstellers

Das von zurückgegebene OpenID Connect-Token GetOpenIdTokenForDeveloperIdentity enthält einen iss (Aussteller-) Anspruch. Das Format dieses Anspruchs hängt von der AWS Region des Identitätspools ab.

Wenn Sie anrufen GetCredentialsForIdentity (erweiterter Ablauf), muss der Zuordnungsschlüssel für die Anmeldung exakt dem iss Anspruch des Tokens entsprechen.

Aussteller des Tokens nach Region

Der Wert des Token-Ausstellers hängt von der Region Ihres Identitätspools ab.

  • Regionen, die den globalen Emittenten verwenden (us-east-1, us-east-2, us-west-1, us-west-2, ap-northeast-1, ap-northeast-2, ap-northeast-3, ap-south-1, ap-southeast-1, ap-southeast-1, ap-southeast-2, ca-central-1, eu-north-1, eu-west-1, eu-west-2, eu-west-3, sa-east-1): cognito-identity.amazonaws.com

  • Die chinesischen Regionen (cn-north-1): cognito-identity---cn-north-1.amazonaws.com.rproxy.goskope.com.cn

  • Alle übrigen Handelsregionen: AWS cognito-identity.region.amazonaws.com

Programmgesteuertes Ermitteln des Anmeldeschlüssels

Anstatt den Anmeldeschlüssel fest zu codieren, können Sie ihn aus dem Token extrahieren:

Java
import java.util.Base64; import org.json.JSONObject; String[] parts = token.split("\\."); String payload = new String(Base64.getUrlDecoder().decode(parts[1])); String issuer = new JSONObject(payload).getString("iss"); // Use 'issuer' as the logins map key in GetCredentialsForIdentity
Python
import base64, json payload = token.split('.')[1] # Add padding if needed payload += '=' * (4 - len(payload) % 4) claims = json.loads(base64.urlsafe_b64decode(payload)) issuer = claims['iss'] # Use 'issuer' as the logins map key
JavaScript
const payload = token.split('.')[1]; const claims = JSON.parse(Buffer.from(payload, 'base64url').toString()); const issuer = claims.iss; // Use 'issuer' as the logins map key

Überlegungen zur Migration

Wenn Sie einen Identitätspool in eine Region migrieren, die einen regionalisierten Aussteller verwendet, sollten Sie Folgendes beachten:

  1. Clients, die cognito-identity.amazonaws.com als Anmeldeschlüssel fest codieren, schlagen im Identitätspool der neuen Region fehl.

  2. Der Kundencode muss aktualisiert werden, um den regionalisierten Aussteller (cognito-identity.new-region.amazonaws.com) verwenden zu können oder um den iss Anspruch dynamisch aus dem Token zu lesen (empfohlen).

  3. In älteren Versionen der AWS Mobile-SDKs ist der globale Emittent fest codiert. Dazu gehören das AWS SDK für Android 2.x und früher sowie das AWS SDK für iOS 2.x und früher. Wenn Ihr Identitätspool einen regionalisierten Aussteller verwendet, führen Sie ein Upgrade auf eine aktuelle SDK-Version durch.

Verbinden mit einer vorhandenen Social Identity

Alle Verknüpfungen von Anbietern müssen über Ihr Backend erfolgen, wenn Sie entwicklerauthentifizierte Identitäten verwenden. Um eine benutzerdefinierte Identität mit der sozialen Identität eines Benutzers zu verbinden (Anmeldung mit Amazon, Anmeldung mit Apple, Facebook oder Google), fügen Sie das Identitätsanbieter-Token bei Ihrem Anruf zur Anmeldeübersicht hinzu. GetOpenIdTokenForDeveloperIdentity Um dies zu ermöglichen, müssen Sie zusätzlich das Token des Social-Identity-Anbieter an den Endbenutzer übergeben, wenn Sie das Backend zur Authentifizierung des Endbenutzers über das Client-SDK aufrufen.

Wenn Sie beispielsweise eine benutzerdefinierte Identität mit Facebook verknüpfen möchten, fügen Sie der Anmeldezuweisung beim Aufrufen von zusätzlich zu Ihrer Identitätsanbieter-ID das Facebook-Token hinzu GetOpenIdTokenForDeveloperIdentity.

logins.put("YOUR_IDENTITY_PROVIDER_NAME","YOUR_END_USER_IDENTIFIER"); logins.put("graph.facebook.com","END_USERS_FACEBOOK_ACCESSTOKEN");

Unterstützen des Anbieterwechsels

Android

Ihre Anwendung erfordert möglicherweise die Unterstützung sowohl von nicht authentifizierten Identitäten oder authentifizierten Identitäten unter Verwendung öffentlicher Anbieter (Anmeldung mit Amazon, Apple, Facebook oder Google) als auch von entwicklerauthentifizierten Identitäten. Der wesentliche Unterschied zwischen entwicklerauthentifizierten Identitäten und anderen Identitäten (nicht authentifizierten Identitäten und authentifizierten Identitäten unter Verwendung von öffentlichen Anbietern) ist die Art, in der die Identitäts-ID und das Token abgerufen werden. Für andere Identitäten interagiert die mobile Anwendung direkt mit Amazon Cognito, anstatt Ihr Authentifizierungssystem zu kontaktieren. Die mobile Anwendung muss daher in Abhängigkeit von der Auswahl durch den App-Benutzer zwei verschiedene Abläufe unterstützen können. Hierzu müssen Sie einige Änderungen am benutzerdefinierten Identitätsanbieter vornehmen.

Die refresh-Methode überprüft die Anmeldezuordnung. Ist diese nicht leer, sondern enthält einen Schlüssel mit dem Entwickleranbieter-Namen, müssen Sie Ihr Backend aufrufen. Rufen Sie andernfalls die IdentityId Get-Methode auf und geben Sie Null zurück.

public String refresh() { setToken(null); // If the logins map is not empty make a call to your backend // to get the token and identityId if (getProviderName() != null && !this.loginsMap.isEmpty() && this.loginsMap.containsKey(getProviderName())) { /** * This is where you would call your backend **/ // now set the returned identity id and token in the provider update(identityId, token); return token; } else { // Call getIdentityId method and return null this.getIdentityId(); return null; } }

Entsprechend weist die Methode getIdentityId zwei Abläufe auf, die vom Inhalt der Anmeldezuweisung abhängen:

public String getIdentityId() { // Load the identityId from the cache identityId = cachedIdentityId; if (identityId == null) { // If the logins map is not empty make a call to your backend // to get the token and identityId if (getProviderName() != null && !this.loginsMap.isEmpty() && this.loginsMap.containsKey(getProviderName())) { /** * This is where you would call your backend **/ // now set the returned identity id and token in the provider update(identityId, token); return token; } else { // Otherwise call &COG; using getIdentityId of super class return super.getIdentityId(); } } else { return identityId; } }

iOS – Objective-C

Ihre Anwendung erfordert möglicherweise die Unterstützung sowohl von nicht authentifizierten Identitäten oder authentifizierten Identitäten unter Verwendung öffentlicher Anbieter (Anmeldung mit Amazon, Apple, Facebook oder Google) als auch von entwicklerauthentifizierten Identitäten. Überschreiben Sie dazu die AWSCognitoCredentialsProviderHelper logins Methode, um die korrekte Login-Map auf der Grundlage des aktuellen Identitätsanbieters zurückgeben zu können. Das folgende Beispiel zeigt, wie Sie zwischen einer authentifizierten Identität, Facebook und einer entwicklerauthentifizierten Identität wechseln können.

- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins { if(/*logic to determine if user is unauthenticated*/) { return [AWSTask taskWithResult:nil]; }else if (/*logic to determine if user is Facebook*/){ return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : [FBSDKAccessToken currentAccessToken] }]; }else { return [super logins]; } }

Beim Wechsel von einem nicht authentifizierten zu einem authentifizierten Anbieter müssen Sie [credentialsProvider clearCredentials]; aufrufen und so erzwingen, dass das SDK die neuen authentifizierten Anmeldeinformationen abruft. Wenn Sie zwischen zwei authentifizierten Anbietern wechseln und nicht versuchen, die beiden Anbieter zu verknüpfen (d. h. Sie stellen im Anmeldeverzeichnis keine Token für mehrere Anbieter bereit), müssen Sie [credentialsProvider clearKeychain]; aufrufen. Dadurch werden sowohl die Anmeldeinformationen als auch die Identität gelöscht und das SDK ruft neue Informationen ab.

iOS – Swift

Ihre Anwendung erfordert möglicherweise die Unterstützung sowohl von nicht authentifizierten Identitäten oder authentifizierten Identitäten unter Verwendung öffentlicher Anbieter (Anmeldung mit Amazon, Apple, Facebook oder Google) als auch von entwicklerauthentifizierten Identitäten. Überschreiben Sie dazu die AWSCognitoCredentialsProviderHelper logins Methode, um die korrekte Login-Map auf der Grundlage des aktuellen Identitätsanbieters zurückgeben zu können. Das folgende Beispiel zeigt, wie Sie zwischen einer authentifizierten Identität, Facebook und einer entwicklerauthentifizierten Identität wechseln können.

override func logins () -> AWSTask<NSDictionary> { if(/*logic to determine if user is unauthenticated*/) { return AWSTask(result:nil) }else if (/*logic to determine if user is Facebook*/){ if let token = AccessToken.current?.authenticationToken { return AWSTask(result: [AWSIdentityProviderFacebook:token]) } return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"])) }else { return super.logins() } }

Beim Wechsel von einem nicht authentifizierten zu einem authentifizierten Anbieter müssen Sie credentialsProvider.clearCredentials() aufrufen und so erzwingen, dass das SDK die neuen authentifizierten Anmeldeinformationen abruft. Wenn Sie zwischen zwei authentifizierten Anbietern wechseln und nicht versuchen, die beiden Anbieter zu verknüpfen (d. h. Sie stellen im Anmeldeverzeichnis keine Token für mehrere Anbieter bereit), müssen Sie aufrufen credentialsProvider.clearKeychain(). Dadurch werden sowohl die Anmeldeinformationen als auch die Identität gelöscht und das SDK ruft neue Informationen ab.

Unity

Ihre Anwendung erfordert möglicherweise die Unterstützung sowohl von nicht authentifizierten Identitäten oder authentifizierten Identitäten unter Verwendung öffentlicher Anbieter (Anmeldung mit Amazon, Apple, Facebook oder Google) als auch von entwicklerauthentifizierten Identitäten. Der wesentliche Unterschied zwischen entwicklerauthentifizierten Identitäten und anderen Identitäten (nicht authentifizierten Identitäten und authentifizierten Identitäten unter Verwendung von öffentlichen Anbietern) ist die Art, in der die Identitäts-ID und das Token abgerufen werden. Für andere Identitäten interagiert die mobile Anwendung direkt mit Amazon Cognito, anstatt Ihr Authentifizierungssystem zu kontaktieren. Die mobile Anwendung muss daher je nach Auswahl durch den App-Benutzer zwei verschiedene Abläufe unterstützen können. Hierzu müssen Sie einige Änderungen am benutzerdefinierten Identitätsanbieter vornehmen.

Die empfohlene Methode, dies in Unity zu tun, besteht darin AbstractCognitoIdentityProvider, Ihren Identitätsanbieter von AmazonCognitoEnhancedIdentityProvide instead of zu erweitern und die übergeordnete RefreshAsync Methode anstelle Ihrer eigenen aufzurufen, falls der Benutzer nicht mit Ihrem eigenen Backend authentifiziert ist. Wenn der Benutzer authentifiziert wurde, können Sie den gleichen Ablauf verwenden, der oben bereits erläutert wurde.

Xamarin

Ihre Anwendung erfordert möglicherweise die Unterstützung sowohl von nicht authentifizierten Identitäten oder authentifizierten Identitäten unter Verwendung öffentlicher Anbieter (Anmeldung mit Amazon, Apple, Facebook oder Google) als auch von entwicklerauthentifizierten Identitäten. Der wesentliche Unterschied zwischen entwicklerauthentifizierten Identitäten und anderen Identitäten (nicht authentifizierten Identitäten und authentifizierten Identitäten unter Verwendung von öffentlichen Anbietern) ist die Art, in der die Identitäts-ID und das Token abgerufen werden. Für andere Identitäten interagiert die mobile Anwendung direkt mit Amazon Cognito, anstatt Ihr Authentifizierungssystem zu kontaktieren. Die mobile Anwendung muss daher je nach Auswahl durch den App-Benutzer zwei verschiedene Abläufe unterstützen können. Hierzu müssen Sie einige Änderungen am benutzerdefinierten Identitätsanbieter vornehmen.