View a markdown version of this page

Developer-authenticated identités - Amazon Cognito

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Developer-authenticated identités

Amazon Cognito prend en charge les identités authentifiées par le développeur en plus de la fédération d'identité Web via Configuration de Facebook en tant qu'IdP de pool d'identités, Configuration de Google en tant qu'IdP de pool d'identités, Configuration de Login with Amazon en tant qu'IdP de pool d'identités et Configuration de la connexion avec Apple en tant qu'IdP du pool d'identités. Grâce aux identités authentifiées par les développeurs, vous pouvez enregistrer et authentifier les utilisateurs via votre propre processus d'authentification existant, tout en continuant à utiliser Amazon Cognito pour synchroniser les données utilisateur et accéder aux ressources. AWS Leur utilisation implique l'interaction entre l'appareil de l'utilisateur final, votre système backend d'authentification et Amazon Cognito. Pour plus de détails, consultez Comprendre l'authentification Amazon Cognito, partie 2 : Identités authentifiées pour les développeurs sur le AWS blog.

Présentation du flux d'authentification

L'opération GetOpenIdTokenForDeveloperIdentity d'API peut lancer l'authentification des développeurs pour l'authentification améliorée et l'authentification de base. Cette API authentifie une demande à l'aide d'informations d'identification administratives. La Logins carte est le nom d'un fournisseur de pool d'identités, login.mydevprovider associé à un identifiant personnalisé.

Exemple :

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

Authentification améliorée

Appelez l'opération GetCredentialsForIdentity API avec une Logins carte où la clé est l'émetteur du jeton renvoyé par GetOpenIdTokenForDeveloperIdentity et la valeur est le jeton lui-même.

L'émetteur (et donc la clé de connexion requise) dépend de la région de votre pool d'identités. Consultez Émetteur de jetons par région la liste complète des régions et de leurs émetteurs de jetons.

Exemple pour un pool d'identités dans une région qui utilise l'émetteur mondial :

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

Exemple pour un pool d'identités dans une nouvelle région (telle que eu-south-2) :

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

La clé de mappage des connexions doit correspondre exactement à la réclamation iss (de l'émetteur) figurant sur le jeton. S'ils ne correspondent pas, GetCredentialsForIdentity renvoie : NotAuthorizedException: Invalid login token. Issuer doesn't match providerName

Astuce

Pour déterminer la clé de connexion correcte par programmation, décodez le jeton (un JWT) et lisez la valeur de la réclamation. iss Utilisez cette valeur comme clé de mappage des connexions.

GetCredentialsForIdentitywith developer-authenticated identity renvoie des informations d'identification temporaires pour le rôle authentifié par défaut du pool d'identités.

Authentification de base

Appelez l'opération AssumeRoleWithWebIdentity API et demandez à n'importe quel rôle IAM pour lequel une relation de confiance appropriée est définie. RoleArn Définissez la valeur de sur WebIdentityToken le jeton obtenu à partir deGetOpenIdTokenForDeveloperIdentity.

Pour plus d'informations sur le flux d'authentification des identités authentifiées par les développeurs et leurs différences par rapport aux identités des fournisseurs externes, consultez. Flux d'authentification des groupes d'identités

Définir un nom de fournisseur de développement et l'associer à un groupe d'identités

Pour utiliser les identités authentifiées par le développeur, vous avez besoin d'une réserve d'identités associée à votre fournisseur de développement. Pour ce faire, procédez comme suit :

Pour ajouter un fournisseur de développement personnalisé
  1. Choisissez Groupes d'identités dans la console Amazon Cognito. Sélectionnez une réserve d'identités.

  2. Choisissez l'onglet Accès utilisateur.

  3. Sélectionnez Ajouter un fournisseur d'identité.

  4. Choisissez Fournisseur du développeur personnalisé.

  5. Saisissez le nom du fournisseur de développement. Vous ne pouvez pas modifier ni supprimer votre fournisseur de développement après l'avoir ajouté.

  6. Cliquez sur Enregistrer les modifications.

Remarque : une fois que le nom du fournisseur a été défini, il ne peut pas être modifié.

Implémentation d'un fournisseur d'identité

Android

Pour utiliser des identités authentifiées par le développeur, implémentez votre propre classe de fournisseur d'identité qui étend AWSAbstractCognitoIdentityProvider. Votre classe de fournisseur d'identité doit retourner un objet de réponse contenant le jeton comme attribut.

Vous trouverez ci-après un exemple de base d'un fournisseur d'identité.

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

Pour utiliser ce fournisseur d'identité, vous devez le transmettre dans CognitoCachingCredentialsProvider. Voici un exemple :

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

Les anciennes versions du AWS SDK pour Android (2.x et antérieures) étaient utilisées cognito-identity.amazonaws.com comme nom de fournisseur interne pour les identités authentifiées par les développeurs. Si votre pool d'identités se trouve dans une région plus récente qui utilise un émetteur régionalisé, passez à une version actuelle du SDK. Pour de plus amples informations, veuillez consulter Format d'émetteur de jetons régional.

iOS – objective-C

Pour utiliser des identités authentifiées par le développeur, implémentez votre propre classe de fournisseur d'identité qui étend AWSCognitoCredentialsProviderHelper. Votre classe de fournisseur d'identité doit retourner un objet de réponse contenant le jeton comme attribut.

@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

Pour utiliser ce fournisseur d'identité, transmettez-le dans AWSCognitoCredentialsProvider comme illustré dans l'exemple suivant :

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];

Si vous souhaitez prendre en charge les identités non authentifiées et les identités authentifiées par le développeur, remplacez la méthode logins dans votre implémentation de AWSCognitoCredentialsProviderHelper.

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

Si vous souhaitez prendre en charge les identités authentifiées par le développeur et les fournisseurs sociaux, vous devez gérer qui est le fournisseur actuel dans votre implémentation logins de AWSCognitoCredentialsProviderHelper.

- (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]; } }
Note

Les anciennes versions du AWS SDK pour iOS (2.x et antérieures) étaient utilisées cognito-identity.amazonaws.com comme nom de fournisseur interne pour les identités authentifiées par les développeurs. Si votre pool d'identités se trouve dans une région plus récente qui utilise un émetteur régionalisé, passez à une version actuelle du SDK. Pour de plus amples informations, veuillez consulter Format d'émetteur de jetons régional.

iOS – swift

Pour utiliser des identités authentifiées par le développeur, implémentez votre propre classe de fournisseur d'identité qui étend AWSCognitoCredentialsProviderHelper. Votre classe de fournisseur d'identité doit retourner un objet de réponse contenant le jeton comme attribut.

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

Pour utiliser ce fournisseur d'identité, transmettez-le dans AWSCognitoCredentialsProvider comme illustré dans l'exemple suivant :

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

Si vous souhaitez prendre en charge les identités non authentifiées et les identités authentifiées par le développeur, remplacez la méthode logins dans votre implémentation de AWSCognitoCredentialsProviderHelper.

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

Si vous souhaitez prendre en charge les identités authentifiées par le développeur et les fournisseurs sociaux, vous devez gérer qui est le fournisseur actuel dans votre implémentation logins de AWSCognitoCredentialsProviderHelper.

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

Une fois que vous obtenez un ID d'identité et un jeton de session à partir de votre système backend, transmettez-les au fournisseur AWS.CognitoIdentityCredentials. La clé de connexion doit correspondre à la valeur demandée par le jetoniss. Pour les pools d'identités dans les régions qui utilisent l'émetteur mondial, utilisezcognito-identity.amazonaws.com. Pour les groupes d'identités dans d'autres régions, utilisezcognito-identity.region.amazonaws.com. Pour de plus amples informations, veuillez consulter Format d'émetteur de jetons régional.

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

Afin d'utiliser les identités authentifiées par le développeur, vous devez étendre CognitoAWSCredentials et remplacer la méthode RefreshIdentity pour récupérer l'ID d'identité utilisateur et le jeton à partir de votre système backend, puis les renvoyer. Voici un exemple simple de fournisseur d'identité qui contacte un système backend hypothétique à l'adresse « example.com » :

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

Le code ci-dessus utilise un objet de répartiteur de thread pour appeler une co-routine. Si vous n'avez pas la possibilité de le faire dans votre projet, vous pouvez utiliser le script suivant dans vos scènes :

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

Afin d'utiliser les identités authentifiées par le développeur, vous devez étendre CognitoAWSCredentials et remplacer la méthode RefreshIdentity pour récupérer l'ID d'identité utilisateur et le jeton à partir de votre système backend, puis les renvoyer. Voici un exemple élémentaire de fournisseur d'identité qui contacte un système backend hypothétique à l'adresse « example.com » :

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

Mise à jour de la carte de connexions (Android et iOS uniquement)

Android

Une fois que l'utilisateur est authentifié avec votre système d'authentification, mettez à jour le mappage des connexions avec le nom du fournisseur de développement et un ID utilisateur de développeur. Il s'agit d'une chaîne alphanumérique qui identifie de manière unique un utilisateur dans votre système d'authentification. Veillez à appeler la méthode refresh après la mise à jour de la carte de connexions, car il se peut que l'identityId ait changé :

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

iOS  – objective-C

Le kit SDK iOS appelle uniquement votre méthode logins pour obtenir la dernière carte de connexions s'il n'existe pas d'informations d'identification ou si celles-ci ont expiré. Si vous voulez forcer le kit SDK à obtenir de nouvelles informations d'identification (par exemple, votre utilisateur final est passé de non authentifié à authentifié et vous souhaitez des informations d'identification pour l'utilisateur authentifié), appelez clearCredentials sur votre credentialsProvider.

[credentialsProvider clearCredentials];

iOS – swift

Le kit SDK iOS appelle uniquement votre méthode logins pour obtenir la dernière carte de connexions s'il n'existe pas d'informations d'identification ou si celles-ci ont expiré. Si vous voulez forcer le kit SDK à obtenir les nouvelles informations d'identification (par exemple, votre utilisateur final est passé de non authentifié à authentifié et vous souhaitez des informations d'identification pour l'utilisateur authentifié), appelez clearCredentials sur votre credentialsProvider.

credentialsProvider.clearCredentials()

Obtention d'un jeton (côté serveur)

Vous obtenez un jeton en appelant GetOpenIdTokenForDeveloperIdentity. Cette API doit être invoquée depuis votre backend à l'aide des informations d'identification AWS du développeur. Elle ne doit pas être appelée depuis le kit SDK client. L'API reçoit l'ID de réserve d'identités Cognito, un mappage de connexions contenant votre nom de fournisseur d'identité comme clé et l'identificateur comme valeur, ainsi qu'éventuellement un ID d'identité Cognito (par exemple, vous transformez un utilisateur non authentifié en utilisateur authentifié). L'identificateur peut être le nom de l'utilisateur, une adresse e-mail ou une valeur numérique. L'API répond à votre appel avec un ID Cognito unique et un jeton OpenID Connect pour l'utilisateur.

Voici quelques éléments à garder à l'esprit sur le jeton renvoyé par   :GetOpenIdTokenForDeveloperIdentity

  • Vous pouvez spécifier une durée d'expiration personnalisée pour le jeton, afin de pouvoir le mettre en cache. Si vous ne fournissez pas de durée d'expiration personnalisée, le jeton est valide pendant 15 minutes.

  • La durée maximale que vous pouvez définir pour un jeton est de 24 heures.

  • Gardez à l'esprit les répercussions que l'augmentation de la durée de validité du jeton peut avoir sur la sécurité. Si un attaquant obtient ce jeton, il peut l'échanger contre des AWS informations d'identification pour l'utilisateur final pendant la durée du jeton.

L'extrait de code Java suivant montre comment initialiser un client Amazon Cognito et récupérer un jeton pour une identité authentifiée par le développeur.

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

Une fois que vous aurez suivi les étapes précédentes, vous devriez être en mesure d'intégrer les identités authentifiées par le développeur dans votre application. Si vous avez des problèmes ou des questions, n'hésitez pas à nous en faire part dans nos forums.

Format d'émetteur de jetons régional

Le jeton OpenID Connect renvoyé par GetOpenIdTokenForDeveloperIdentity contient une réclamation iss (émetteur). Le format de cette réclamation dépend de la AWS région du pool d'identités.

Lorsque vous appelez GetCredentialsForIdentity (flux amélioré), la clé de la carte de connexion doit correspondre exactement à la valeur iss réclamée par le jeton.

Émetteur de jetons par région

La valeur de l'émetteur du jeton dépend de la région de votre pool d'identités.

  • Régions qui utilisent l'émetteur mondial (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-2, ca-central-1, eu-north-1, eu-west-1, eu-west-2, eu-west-2, eu-west-2 3, sa-est-1) : cognito-identity.amazonaws.com

  • Les régions de Chine (cn-north-1) : cognito-identity---cn-north-1.amazonaws.com.rproxy.goskope.com.cn

  • Toutes les autres AWS régions commerciales  : cognito-identity.region.amazonaws.com

Déterminer la clé de connexion par programmation

Plutôt que de coder en dur la clé de connexion, vous pouvez l'extraire du jeton :

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

Considérations concernant la migration

Si vous migrez un pool d'identités vers une région qui utilise un émetteur régionalisé, tenez compte des points suivants :

  1. Les clients dont la clé de connexion est codée en dur cognito-identity.amazonaws.com échoueront dans le pool d'identités de la nouvelle région.

  2. Le code client doit être mis à jour pour utiliser l'émetteur régionalisé (cognito-identity.new-region.amazonaws.com) ou pour lire dynamiquement la iss réclamation à partir du jeton (recommandé).

  3. Les anciennes versions des SDK AWS mobiles codent en dur l'émetteur mondial. Cela inclut le AWS SDK pour Android 2.x et versions antérieures, et le AWS SDK pour iOS 2.x et versions antérieures. Si votre pool d'identités utilise un émetteur régionalisé, passez à une version actuelle du SDK.

Connexion à une identité sociale existante

Toutes les liaisons de fournisseurs lorsque vous utilisez des identités authentifiées par le développeur doivent être effectuées à partir de votre système backend. Pour associer une identité personnalisée à l'identité sociale d'un utilisateur (connexion avec Amazon, connexion avec Apple, Facebook ou Google), ajoutez le jeton du fournisseur d'identité à la carte de connexion lorsque vous appelez GetOpenIdTokenForDeveloperIdentity. Pour rendre cela possible, lorsque vous appelez votre système backend depuis votre kit SDK client pour authentifier votre utilisateur final, transmettez également le jeton du fournisseur de réseaux sociaux de l'utilisateur final.

Par exemple, si vous essayez de lier une identité personnalisée à Facebook, vous ajoutez le jeton Facebook en plus de votre identificateur de fournisseur d'identité à la carte de connexions lorsque vous appelez GetOpenIdTokenForDeveloperIdentity.

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

Transition d'un fournisseur à un autre

Android

Votre application peut nécessiter de prendre en charge les identités authentifiées ou non authentifiées via les fournisseurs publics (Login with Amazon, Se connecter avec Apple, Facebook ou Google), ainsi que les identités authentifiées par le développeur. La principale différence entre les identités authentifiées par le développeur et les autres (identités non authentifiées ou authentifiées via un fournisseur public) réside dans le mode de récupération de l'ID d'identité et du jeton. Pour les autres identités, l'application mobile interagit directement avec Amazon Cognito au lieu de communiquer avec votre système d'authentification. Par conséquent, l'application mobile doit être capable de prendre en charge deux flux distincts selon le choix de l'utilisateur de l'application. Pour cela, vous devez apporter des modifications au fournisseur d'identités personnalisées.

La méthode refresh vérifie le mappage des connexions. Si ce mappage n'est pas vide et qu'il contient une clé avec le nom du fournisseur du développement, appelez votre système backend. Sinon, appelez la IdentityId méthode get et renvoyez null.

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

De même, la méthode getIdentityId propose deux flux en fonction du contenu de la carte de connexions :

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

Votre application peut nécessiter de prendre en charge les identités authentifiées ou non authentifiées via les fournisseurs publics (Login with Amazon, Se connecter avec Apple, Facebook ou Google), ainsi que les identités authentifiées par le développeur. Pour ce faire, remplacez la AWSCognitoCredentialsProviderHelper logins méthode afin de pouvoir renvoyer la carte de connexion correcte en fonction du fournisseur d'identité actuel. Cet exemple montre comment vous pouvez alterner entre une identité non authentifiée, Facebook et authentifiée par le développeur.

- (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]; } }

Lorsque vous passez d'une identité non authentifiée à une identité authentifiée, vous devez appeler [credentialsProvider clearCredentials]; pour forcer le kit SDK à obtenir les nouvelles informations d'identification authentifiées. Lorsque vous basculez entre deux fournisseurs authentifiés et que vous n'essayez pas de lier les deux fournisseurs (par exemple, si vous ne fournissez pas de jetons pour plusieurs fournisseurs dans votre dictionnaire de connexions), appelez [credentialsProvider clearKeychain];. Cela efface les informations d'identification et l'identité, et force le kit SDK à obtenir de nouvelles informations d'identification.

iOS – swift

Votre application peut nécessiter de prendre en charge les identités authentifiées ou non authentifiées via les fournisseurs publics (Login with Amazon, Se connecter avec Apple, Facebook ou Google), ainsi que les identités authentifiées par le développeur. Pour ce faire, remplacez la AWSCognitoCredentialsProviderHelper logins méthode afin de pouvoir renvoyer la carte de connexion correcte en fonction du fournisseur d'identité actuel. Cet exemple montre comment vous pouvez alterner entre une identité non authentifiée, Facebook et authentifiée par le développeur.

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

Lorsque vous passez d'une identité non authentifiée à une identité authentifiée, vous devez appeler credentialsProvider.clearCredentials() pour forcer le kit SDK à obtenir les nouvelles informations d'identification authentifiées. Lorsque vous basculez entre deux fournisseurs authentifiés et que vous n'essayez pas de lier les deux fournisseurs (vous ne fournissez pas de jetons pour plusieurs fournisseurs dans votre dictionnaire de connexions), vous devez appeler credentialsProvider.clearKeychain(). Cela efface les informations d'identification et l'identité, et force le kit SDK à obtenir de nouvelles informations d'identification.

Unity

Votre application peut nécessiter de prendre en charge les identités authentifiées ou non authentifiées via les fournisseurs publics (Login with Amazon, Se connecter avec Apple, Facebook ou Google), ainsi que les identités authentifiées par le développeur. La principale différence entre les identités authentifiées par le développeur et les autres (identités non authentifiées ou authentifiées via un fournisseur public) réside dans le mode de récupération de l'ID d'identité et du jeton. Pour les autres identités, l'application mobile interagit directement avec Amazon Cognito au lieu de communiquer avec votre système d'authentification. L'application mobile doit être capable de prendre en charge deux flux distincts selon le choix de l'utilisateur de l'application. Pour cela, vous devrez apporter des modifications au fournisseur d'identités personnalisées.

La méthode recommandée pour le faire dans Unity est d'étendre votre fournisseur d'identité depuis AmazonCognitoEnhancedIdentityProvide au lieu de AbstractCognitoIdentityProvider et d'appeler la RefreshAsync méthode parent au lieu de la vôtre au cas où l'utilisateur ne serait pas authentifié avec votre propre backend. Si l'utilisateur est authentifié, vous pouvez utiliser le flux expliqué précédemment.

Xamarin

Votre application peut nécessiter de prendre en charge les identités authentifiées ou non authentifiées via les fournisseurs publics (Login with Amazon, Se connecter avec Apple, Facebook ou Google), ainsi que les identités authentifiées par le développeur. La principale différence entre les identités authentifiées par le développeur et les autres (identités non authentifiées ou authentifiées via un fournisseur public) réside dans le mode de récupération de l'ID d'identité et du jeton. Pour les autres identités, l'application mobile interagit directement avec Amazon Cognito au lieu de communiquer avec votre système d'authentification. L'application mobile doit être capable de prendre en charge deux flux distincts selon le choix de l'utilisateur de l'application. Pour cela, vous devez apporter des modifications au fournisseur d'identités personnalisées.