View a markdown version of this page

Developer-authenticated identidades - Amazon Cognito

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Developer-authenticated identidades

O Amazon Cognito é compatível com identidades autenticadas pelo desenvolvedor, além da federação de identidades da web por meio de Configurar o Facebook como um IdP de bancos de identidades, Configurar o Google como um IdP do banco de identidades, Configurar o Login with Amazon como um IdP de bancos de identidades e Configurar o Login com a Apple como um IdP do banco de identidades. Com identidades autenticadas pelo desenvolvedor, você pode registrar e autenticar usuários por meio de seu próprio processo de autenticação existente, enquanto ainda usa o Amazon Cognito para sincronizar dados do usuário e acessar recursos. AWS O uso de identidades autenticadas pelo desenvolvedor engloba a interação entre o dispositivo do usuário final, o back-end para autenticação e o Amazon Cognito. Para obter mais detalhes, consulte Compreendendo a autenticação do Amazon Cognito, parte 2: identidades autenticadas pelo desenvolvedor, no blog. AWS

Como entender o fluxo de autenticação

A operação GetOpenIdTokenForDeveloperIdentity da API pode iniciar a autenticação do desenvolvedor para autenticação avançada e básica. Essa API autentica uma solicitação com credenciais administrativas. O mapa Logins é um nome de provedor do desenvolvedor do banco de identidades, como login.mydevprovider, emparelhado com um identificador personalizado.

Exemplo:

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

Autenticação aprimorada

Chame a operação da GetCredentialsForIdentity API com um Logins mapa em que a chave é o emissor do token retornado e o valor é o próprio token. GetOpenIdTokenForDeveloperIdentity

O emissor (e, portanto, a chave de login necessária) depende da região do seu grupo de identidades. Veja Emissor de token por região a lista completa de regiões e seus emissores de tokens.

Exemplo de um pool de identidades em uma região que usa o emissor global:

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

Exemplo de um pool de identidades em uma região mais nova (como eu-south-2):

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

A chave do mapa de logins deve corresponder exatamente à declaração iss (do emissor) no token. Se eles não corresponderem, GetCredentialsForIdentity retorna: NotAuthorizedException: Invalid login token. Issuer doesn't match providerName

dica

Para determinar a chave de login correta de forma programática, decodifique o token (um JWT) e leia o valor da declaração. iss Use esse valor como a chave do mapa de logins.

GetCredentialsForIdentity com identidades autenticadas pelo desenvolvedor retorna credenciais temporárias para a função autenticada padrão do banco de identidades.

Autenticação básica

Chame a operação RoleArn da AssumeRoleWithWebIdentity API e solicite qualquer função do IAM que tenha uma relação de confiança apropriada definida. Defina o valor de WebIdentityToken para o token obtido de GetOpenIdTokenForDeveloperIdentity.

Para obter informações sobre o fluxo de autenticação das identidades autenticadas pelo desenvolvedor e como elas diferem das identidades do provedor externo, consulte Fluxo de autenticação dos bancos de identidades.

Defina um nome de provedor do desenvolvedor e associe-o a um grupo de identidades

Para usar identidades autenticadas pelo desenvolvedor, você precisará de um banco de identidades associado ao provedor do desenvolvedor. Para fazer isso, siga estas etapas:

Como adicionar um provedor de desenvolvedor personalizado
  1. Selecione Bancos de identidades no console do Amazon Cognito. Selecione um banco de identidades.

  2. Selecione a guia Acesso do usuário.

  3. Selecione Adicionar provedor de identidade.

  4. Escolha Provedor de desenvolvedor personalizado.

  5. Insira um Nome de provedor de desenvolvedor. Você não poderá alterar nem excluir o provedor de desenvolvedor depois de adicioná-lo.

  6. Selecione Salvar alterações.

Observação: depois que o nome do provedor for definido, ele não poderá ser alterado.

Implementar um provedor de identidade

Android

Para usar as identidades autenticadas pelo desenvolvedor, implemente sua própria classe de provedor de identidades, que estende AWSAbstractCognitoIdentityProvider. A classe de provedor de identidade deve retornar um objeto de resposta contendo o token como um atributo.

Veja a seguir um exemplo básico de um provedor de identidades.

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

Para usar esse provedor de identidade, você precisa inseri-lo em CognitoCachingCredentialsProvider. Veja um exemplo abaixo:

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

As versões mais antigas do AWS SDK para Android (2.x e anteriores) são usadas cognito-identity.amazonaws.com como nome do provedor interno para identidades autenticadas pelo desenvolvedor. Se seu grupo de identidades estiver em uma região mais nova que usa um emissor regionalizado, atualize para uma versão atual do SDK. Para obter mais informações, consulte Formato de emissor de token regional.

iOS - objective-C

Para usar as identidades autenticadas pelo desenvolvedor, implemente sua própria classe de provedor de identidades, que estende AWSCognitoCredentialsProviderHelper. A classe de provedor de identidade deve retornar um objeto de resposta contendo o token como um atributo.

@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

Para usar esse provedor de identidade, insira-o em AWSCognitoCredentialsProvider, conforme mostrado no exemplo a seguir:

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

Para oferecer compatibilidade com identidades não autenticadas e identidades autenticadas pelo desenvolvedor, substitua o método logins na implementação de AWSCognitoCredentialsProviderHelper.

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

Para oferecer compatibilidade com identidades autenticadas pelo desenvolvedor e provedores de redes sociais, gerencie o provedor atual da implementação 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]; } }
nota

As versões mais antigas do AWS SDK para iOS (2.x e anteriores) são usadas cognito-identity.amazonaws.com como nome do provedor interno para identidades autenticadas pelo desenvolvedor. Se seu grupo de identidades estiver em uma região mais nova que usa um emissor regionalizado, atualize para uma versão atual do SDK. Para obter mais informações, consulte Formato de emissor de token regional.

iOS - swift

Para usar as identidades autenticadas pelo desenvolvedor, implemente sua própria classe de provedor de identidades, que estende AWSCognitoCredentialsProviderHelper. A classe de provedor de identidade deve retornar um objeto de resposta contendo o token como um atributo.

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

Para usar esse provedor de identidade, insira-o em AWSCognitoCredentialsProvider, conforme mostrado no exemplo a seguir:

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

Para oferecer compatibilidade com identidades não autenticadas e identidades autenticadas pelo desenvolvedor, substitua o método logins na implementação de AWSCognitoCredentialsProviderHelper.

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

Para oferecer compatibilidade com identidades autenticadas pelo desenvolvedor e provedores de redes sociais, gerencie o provedor atual da implementação 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

Depois de obter um ID de identidade e um token de sessão no back-end, você deve inseri-los no provedor AWS.CognitoIdentityCredentials. A chave de login deve corresponder à iss reivindicação do token. Para grupos de identidade em regiões que usam o emissor global, usecognito-identity.amazonaws.com. Para grupos de identidade em outras regiões, usecognito-identity.region.amazonaws.com. Para obter mais informações, consulte Formato de emissor de token regional.

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

Para usar identidades autenticadas pelo desenvolvedor, é necessário estender CognitoAWSCredentials e substituir o método RefreshIdentity para recuperar o ID de identidade e o token do usuário no back-end e retorná-los. Veja a seguir um exemplo simples de um provedor de identidades que entrará em contato com um back-end hipotético em “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); } }

O código acima usa um objeto dispatcher de thread para chamar uma corrotina. Se você não tem uma maneira de fazer isso no seu projeto, use o seguinte script em suas cenas:

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

Para usar identidades autenticadas pelo desenvolvedor, é necessário estender CognitoAWSCredentials e substituir o método RefreshIdentity para recuperar o ID de identidade e o token do usuário no back-end e retorná-los. Veja a seguir um exemplo básico de um provedor de identidades que entrará em contato com um back-end hipotético em “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; } }

Como atualizar o mapa de logins (apenas Android e iOS)

Android

Depois de autenticar o usuário com êxito por meio do sistema de autenticação, atualize o mapa de logins com o nome do provedor do desenvolvedor e um identificador de usuário do desenvolvedor. Essa é uma sequência alfanumérica que identifica exclusivamente um usuário em seu sistema de autenticação. Não deixe de chamar o método refresh após a atualização do mapa de logins, pois identityId pode ter sido alterado:

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

iOS - objective-C

O iOS SDK chama o método logins apenas para obter o mapa de logins mais recente, caso não haja credenciais ou elas tenham expirado. Se você quiser forçar o SDK a obter novas credenciais (por exemplo, se o usuário final tiver passado de não autenticado para autenticado e você precisar das credenciais com base no usuário autenticado), chame clearCredentials no credentialsProvider.

[credentialsProvider clearCredentials];

iOS - swift

O iOS SDK chama o método logins apenas para obter o mapa de logins mais recente, caso não haja credenciais ou elas tenham expirado. Se você quiser forçar o SDK a obter novas credenciais (por exemplo, se o usuário final era não autenticado e se tornou autenticado, e você precisar das credenciais com base no usuário autenticado), chame clearCredentials no credentialsProvider.

credentialsProvider.clearCredentials()

Como obter um token (lado do servidor)

Você obtém um token ligando GetOpenIdTokenForDeveloperIdentity. Essa API deve ser invocada do seu back-end usando credenciais de AWS desenvolvedor. Ele não deve ser invocada no SDK do cliente. A API recebe o ID do banco de identidades do Cognito; um mapa de logins contendo o nome do provedor de identidades como chave e o identificador como valor; e, opcionalmente, o ID de identidade do Cognito (por exemplo, você está autenticando um usuário não autenticado). O identificador pode ser o nome de usuário do seu usuário, um endereço de e-mail ou um valor numérico. A API responde à chamada com um ID exclusivo do Cognito para o usuário e um token do OpenID Connect para o usuário final.

Tenha em mente as seguintes informações sobre o token retornado por GetOpenIdTokenForDeveloperIdentity:

  • Você pode especificar um período de expiração personalizado para o token, a fim de que possa armazená-lo em cache. Se você não fornecer o período de expiração personalizado, o token ficará válido por 15 minutos.

  • A duração máxima do token que você pode definir é 24 horas.

  • Tenha em mente as implicações de segurança relacionadas ao aumento da duração do token. Se um invasor obtiver esse token, ele poderá trocá-lo por AWS credenciais para o usuário final durante a duração do token.

O trecho Java a seguir mostra como inicializar um cliente do Amazon Cognito e recuperar um token para uma identidade autenticada pelo desenvolvedor.

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

Após as etapas acima, você conseguirá integrar as identidades autenticadas pelo desenvolvedor em sua aplicação. Se você tiver problemas ou dúvidas, fique à vontade para publicar em nossos fóruns.

Formato de emissor de token regional

O token OpenID Connect retornado por GetOpenIdTokenForDeveloperIdentity contém uma declaração iss (emissora). O formato dessa declaração depende da AWS região do grupo de identidades.

Quando você chama GetCredentialsForIdentity (fluxo aprimorado), a chave do mapa de logins deve corresponder exatamente à iss declaração do token.

Emissor de token por região

O valor do emissor do token depende da região do seu pool de identidade.

  • Regiões que usam o emissor global (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-central-1, eu-north-1, eu-west-1, eu-west-2, eu-west-2, eu-west-2, eu-west-2 -oeste-3, sa-leste-1): cognito-identity.amazonaws.com

  • As regiões da China (cn-north-1): cognito-identity---cn-north-1.amazonaws.com.rproxy.goskope.com.cn

  • Todas as AWS regiões comerciais restantes: cognito-identity.region.amazonaws.com

Determinando a chave de login programaticamente

Em vez de codificar a chave de login, você pode extraí-la do token:

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

Considerações sobre a migração

Se você estiver migrando um grupo de identidades para uma região que usa um emissor regionalizado, esteja ciente do seguinte:

  1. Clientes que codificarem cognito-identity.amazonaws.com como chave de login falharão no pool de identidades da nova região.

  2. O código do cliente deve ser atualizado para usar o emissor regionalizado (cognito-identity.new-region.amazonaws.com) ou para ler dinamicamente a iss declaração do token (recomendado).

  3. As versões mais antigas dos SDKs AWS móveis codificam o emissor global. Isso inclui o AWS SDK para Android 2.x e versões anteriores e o AWS SDK para iOS 2.x e versões anteriores. Se seu grupo de identidades usa um emissor regionalizado, atualize para uma versão atual do SDK.

Conectar-se a uma identidade social existente

Todos os vínculos de provedores durante o uso de identidades autenticadas pelo desenvolvedor devem ser feitos no back-end. Para conectar uma identidade personalizada à identidade social de um usuário (faça login na Amazon, faça login na Apple, Facebook ou Google), adicione o token do provedor de identidade ao mapa de logins ao ligar GetOpenIdTokenForDeveloperIdentity. Para que isso seja possível, ao chamar o backend no SDK do cliente para autenticar o usuário final, insira também o token do provedor de redes sociais do usuário final.

Por exemplo, se você estiver tentando vincular uma identidade personalizada ao Facebook, adicione o token do Facebook, além do identificador do provedor de identidade, ao mapa de logins quando chamar GetOpenIdTokenForDeveloperIdentity.

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

Dar suporte à transição entre provedores

Android

Talvez sua aplicação exija compatibilidade com identidades autenticadas ou não autenticadas por meio de provedores públicos (Login with Amazon, Sign in with Apple, Facebook ou Google), bem como as identidades autenticadas pelo desenvolvedor. A principal diferença entre as identidades autenticadas pelo desenvolvedor e outras identidades (identidades autenticadas e não autenticadas por meio do provedor público) é a maneira como o ID de identidade e o token são obtidos. Para outras identidades, o aplicativo móvel vai interagir diretamente com o Amazon Cognito, em vez de entrar em contato com o sistema de autenticação. Portanto, o aplicativo para dispositivos móveis deve ser capaz de oferecer suporte a dois fluxos distintos, dependendo da opção feita pelo usuário do aplicativo. Para isso, você precisará fazer algumas alterações no provedor de identidades personalizado.

O método refresh confere o mapa de logins. Se o mapa não estiver vazio e tiver uma chave com o nome do provedor do desenvolvedor, chame o back-end. Caso contrário, chame o IdentityId método get e retorne 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; } }

Da mesma forma, o método getIdentityId terá dois fluxos de acordo com o conteúdo do mapa de logins:

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

Talvez sua aplicação exija compatibilidade com identidades autenticadas ou não autenticadas por meio de provedores públicos (Login with Amazon, Sign in with Apple, Facebook ou Google), bem como as identidades autenticadas pelo desenvolvedor. Para fazer isso, substitua o AWSCognitoCredentialsProviderHelper logins método para poder retornar o mapa de logins correto com base no provedor de identidade atual. Este exemplo mostra como alternar entre identidade não autenticada, Facebook e identidade autenticada pelo desenvolvedor.

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

Ao fazer a transição de não autenticada para autenticada, você deverá chamar [credentialsProvider clearCredentials]; para forçar o SDK a obter novas credenciais autenticadas. Quando você alternar entre dois provedores autenticados e estiver tentando vincular os dois provedores (por exemplo, se não estiver fornecendo tokens a vários provedores no dicionário de logins), chame [credentialsProvider clearKeychain];. Isso limpará as credenciais e a identidade, e forçará o SDK a obter novas.

iOS - swift

Talvez sua aplicação exija compatibilidade com identidades autenticadas ou não autenticadas por meio de provedores públicos (Login with Amazon, Sign in with Apple, Facebook ou Google), bem como as identidades autenticadas pelo desenvolvedor. Para fazer isso, substitua o AWSCognitoCredentialsProviderHelper logins método para poder retornar o mapa de logins correto com base no provedor de identidade atual. Este exemplo mostra como alternar entre identidade não autenticada, Facebook e identidade autenticada pelo desenvolvedor.

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

Ao fazer a transição de não autenticada para autenticada, você deverá chamar credentialsProvider.clearCredentials() para forçar o SDK a obter novas credenciais autenticadas. Quando você alternar entre dois provedores autenticados e estiver tentando vincular os dois provedores (ou seja, se você não estiver fornecendo tokens para vários provedores no dicionário de logins), chame credentialsProvider.clearKeychain(). Isso limpará as credenciais e a identidade, e forçará o SDK a obter novas.

Unity

Talvez sua aplicação exija compatibilidade com identidades autenticadas ou não autenticadas por meio de provedores públicos (Login with Amazon, Sign in with Apple, Facebook ou Google), bem como as identidades autenticadas pelo desenvolvedor. A principal diferença entre as identidades autenticadas pelo desenvolvedor e outras identidades (identidades autenticadas e não autenticadas por meio do provedor público) é a maneira como o ID de identidade e o token são obtidos. Para outras identidades, o aplicativo móvel vai interagir diretamente com o Amazon Cognito, em vez de entrar em contato com o sistema de autenticação. Portanto, o aplicativo móvel deve ser compatível com dois fluxos distintos, dependendo da opção feita pelo respectivo usuário. Para isso, você precisará fazer algumas alterações no provedor de identidade personalizado.

A maneira recomendada de fazer isso no Unity é estender seu provedor de identidade AmazonCognitoEnhancedIdentityProvide em vez de e chamar o RefreshAsync método pai em vez do seu próprio AbstractCognitoIdentityProvider, caso o usuário não esteja autenticado com seu próprio back-end. Se o usuário estiver autenticado, use o mesmo fluxo descrito antes.

Xamarin

Talvez sua aplicação exija compatibilidade com identidades autenticadas ou não autenticadas por meio de provedores públicos (Login with Amazon, Sign in with Apple, Facebook ou Google), bem como as identidades autenticadas pelo desenvolvedor. A principal diferença entre as identidades autenticadas pelo desenvolvedor e outras identidades (identidades autenticadas e não autenticadas por meio do provedor público) é a maneira como o ID de identidade e o token são obtidos. Para outras identidades, o aplicativo móvel vai interagir diretamente com o Amazon Cognito, em vez de entrar em contato com o sistema de autenticação. Portanto, o aplicativo móvel deve ser compatível com dois fluxos distintos, dependendo da opção feita pelo respectivo usuário. Para isso, você precisará fazer algumas alterações no provedor de identidades personalizado.