Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Developer-authenticated identidades
Amazon Cognito es compatible con las identidades autenticadas por el desarrollador y con la federación de identidades web mediante Configuración de Facebook como un IdP de grupos de identidades, Configuración de Google como IdP de grupo de identidades, Configuración de Login with Amazon como IdP de grupos de identidades y Configuración de Inicio de sesión con Apple como ldP de grupo de identidades. Con las identidades autenticadas por el desarrollador, puede registrar y autenticar a los usuarios mediante su propio proceso de autenticación existente y, al mismo tiempo, utilizar Amazon Cognito para sincronizar los datos de los usuarios y acceder a los recursos. AWS El uso de identidades autenticadas por el desarrollador implica la interacción entre el dispositivo del usuario final, su back-end para la autenticación y Amazon Cognito. Para obtener más información, consulte Descripción de la autenticación de Amazon Cognito, parte 2: Identidades autenticadas por desarrolladores, en el blog
Descripción del flujo de autenticación
La operación de la GetOpenIdTokenForDeveloperIdentityAPI puede iniciar la autenticación del desarrollador tanto para la autenticación básica como para la mejorada. Esta API autentica una solicitud con credenciales administrativas. La asignación Logins es el nombre de un desarrollador y proveedor del grupo de identidades, como login.mydevprovider, emparejado con un identificador personalizado.
Ejemplo:
"Logins": { "login.mydevprovider": "my developer identifier" }
Autenticación mejorada
Llama a la operación de la GetCredentialsForIdentityAPI con un Logins mapa en el que la clave sea el emisor del token devuelto y el valor sea el propio token. GetOpenIdTokenForDeveloperIdentity
El emisor (y, por tanto, la clave de inicio de sesión requerida) depende de la región del grupo de identidades. Consulta Emisor del token por región la lista completa de regiones y sus emisores de tokens.
Ejemplo de un grupo de identidades en una región que utiliza el emisor global:
"Logins": { "cognito-identity.amazonaws.com": "eyJra12345EXAMPLE" }
Ejemplo de un grupo de identidades en una región más nueva (como eu-south-2):
"Logins": { "cognito-identity.eu-south-2.amazonaws.com": "eyJra12345EXAMPLE" }
importante
La clave del mapa de inicios de sesión debe coincidir exactamente con la afirmación iss (del emisor) que figura en el token. Si no coinciden, GetCredentialsForIdentity devuelve: NotAuthorizedException: Invalid login token. Issuer doesn't match
providerName
sugerencia
Para determinar la clave de inicio de sesión correcta mediante programación, decodifique el token (un JWT) y lea el valor declarado. iss Usa ese valor como clave de mapa de inicios de sesión.
GetCredentialsForIdentity con identidades autenticadas por el desarrollador, devuelve credenciales temporales para el rol autenticado predeterminado del grupo de identidades.
Autenticación básica
Llame a la operación de la AssumeRoleWithWebIdentityAPI y solicite la RoleArn de cualquier función de IAM que tenga definida una relación de confianza adecuada. Defina el valor de WebIdentityToken en el token obtenido de GetOpenIdTokenForDeveloperIdentity.
Para obtener más información acerca del flujo de autenticación de las identidades autenticadas por el desarrollador y en qué se diferencian de las identidades de proveedores externos, consulte Flujo de autenticación de grupos de identidades.
Definición de un nombre de proveedor de desarrollador y asociación de dicho nombre a un grupo de identidades
Para utilizar las identidades autenticadas por el desarrollador, es preciso que el proveedor de desarrollador tenga un grupo de identidades asociado. Para ello, siga estos pasos:
Para agregar un proveedor de desarrolladores personalizado
-
Elija Grupos de identidades en la consola de Amazon Cognito
. Seleccione un grupo de identidades. -
Elija la pestaña Acceso de usuario.
-
Seleccione Agregar proveedor de identidades.
-
Elija un Proveedor de desarrolladores personalizado.
-
Ingrese un Nombre de proveedor de desarrolladores. No puede cambiar ni eliminar el proveedor de desarrolladores después de agregarlo.
-
Seleccione Guardar cambios.
Nota: una vez que se haya definido el nombre del proveedor, este no podrá modificarse.
Implementación de un proveedor de identidad
Android
Para usar las identidades autenticadas por el desarrollador, implemente su propia clase de proveedor de identidad que amplía AWSAbstractCognitoIdentityProvider. La clase de proveedor de identidad debe devolver un objeto de respuesta que contenga el token como un atributo.
El siguiente es un ejemplo básico de un proveedor 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 utilizar este proveedor de identidad, tiene que pasarlo en CognitoCachingCredentialsProvider. A continuación se muestra un ejemplo:
DeveloperAuthenticationProvider developerProvider = new DeveloperAuthenticationProvider( null, "IDENTITYPOOLID", Regions.USEAST1); CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( context, developerProvider, Regions.USEAST1);
nota
Las versiones anteriores del AWS SDK para Android (2.x y anteriores) se utilizan cognito-identity.amazonaws.com como nombre de proveedor interno para las identidades autenticadas por el desarrollador. Si tu grupo de identidades se encuentra en una región más reciente que usa un emisor regionalizado, actualiza a una versión actual del SDK. Para obtener más información, consulte Formato de emisor de fichas regional.
iOS - Objective-C
Para usar las identidades autenticadas por el desarrollador, implemente su propia clase de proveedor de identidad que amplía AWSCognitoCredentialsProviderHelper
@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 utilizar este proveedor de identidad, tiene que pasarlo en AWSCognitoCredentialsProvider, como se muestra en el ejemplo siguiente:
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 quiere dar soporte a las identidades sin autenticar y a las identidades autenticadas por el desarrollador, anule el método logins en la implementación de AWSCognitoCredentialsProviderHelper.
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins { if(/*logic to determine if user is unauthenticated*/) { return [AWSTask taskWithResult:nil]; }else{ return [super logins]; } }
Si quiere dar soporte a las identidades autenticadas por el desarrollador y a los proveedores sociales, debe administrar quién es el proveedor actual en la implementación 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
Las versiones anteriores del AWS SDK para iOS (2.x y anteriores) se utilizan cognito-identity.amazonaws.com como nombre de proveedor interno para las identidades autenticadas por el desarrollador. Si su grupo de identidades se encuentra en una región más reciente que utiliza un emisor regionalizado, actualícelo a una versión actual del SDK. Para obtener más información, consulte Formato de emisor de fichas regional.
iOS - Swift
Para usar las identidades autenticadas por el desarrollador, implemente su propia clase de proveedor de identidad que amplía AWSCognitoCredentialsProviderHelper
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 utilizar este proveedor de identidad, tiene que pasarlo en AWSCognitoCredentialsProvider, como se muestra en el ejemplo siguiente:
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 quiere dar soporte a las identidades sin autenticar y a las identidades autenticadas por el desarrollador, anule el método logins en la implementación de AWSCognitoCredentialsProviderHelper.
override func logins () -> AWSTask<NSDictionary> { if(/*logic to determine if user is unauthenticated*/) { return AWSTask(result:nil) }else { return super.logins() } }
Si quiere dar soporte a las identidades autenticadas por el desarrollador y a los proveedores sociales, debe administrar quién es el proveedor actual en la implementación 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
Una vez que obtengas un identificador de identidad y un token de sesión de tu servidor, los pasarás al fromCognitoIdentity proveedor desde allí. @aws-sdk/credential-providers La clave de inicio de sesión debe coincidir con la iss afirmación del token. Para los grupos de identidades en las regiones que utilizan el emisor global, utilice. cognito-identity.amazonaws.com Para grupos de identidades en otras regiones, utilicecognito-identity.. Para obtener más información, consulte Formato de emisor de fichas regional.region.amazonaws.com
import { fromCognitoIdentity } from "@aws-sdk/credential-providers"; const token = 'TOKEN_RETURNED_FROM_YOUR_PROVIDER'; const region = 'IDENTITY_POOL_REGION'; // Extract the issuer from the token const payload = token.split('.')[1]; const claims = JSON.parse(Buffer.from(payload, 'base64url').toString()); const providerName = claims.iss; // Your backend already established the identity, so use fromCognitoIdentity // (which calls GetCredentialsForIdentity directly for the identity ID you pass) // rather than fromCognitoIdentityPool (which would call GetId and resolve a new identity). const credentials = fromCognitoIdentity({ identityId: 'IDENTITY_ID_RETURNED_FROM_YOUR_PROVIDER', logins: { [providerName]: token }, clientConfig: { region } }); // Attach the provider to each service client that needs credentials. const client = new SomeServiceClient({ region, credentials });
Actualización de la asignación de inicios de sesión (solo Android e iOS)
Android
Después de autenticar correctamente al usuario con su propio sistema de autenticación, actualice la asignación de inicios de sesión con el nombre del proveedor de desarrollador y un identificador de usuario de desarrollador. Se trata de una cadena alfanumérica que identifica de forma exclusiva a un usuario en el sistema de autenticación. Asegúrese de llamar al método refresh después de actualizar la asignación de inicios de sesión, ya que identityId podría haber cambiado:
HashMap<String, String> loginsMap = new HashMap<String, String>(); loginsMap.put(developerAuthenticationProvider.getProviderName(), developerUserIdentifier); credentialsProvider.setLogins(loginsMap); credentialsProvider.refresh();
iOS - Objective-C
El SDK para iOS solo llama al método logins para obtener la última asignación de inicios de sesión si no hay credenciales o estas han caducado. Si quiere obligar al SDK a obtener nuevas credenciales (por ejemplo, el usuario final ha pasado de no estar autenticado a estar autenticado y usted quiere credenciales sobre el usuario autenticado), llame a clearCredentials en su credentialsProvider.
[credentialsProvider clearCredentials];
iOS - Swift
El SDK para iOS solo llama al método logins para obtener la última asignación de inicios de sesión si no hay credenciales o estas han caducado. Si quiere obligar al SDK a obtener nuevas credenciales (por ejemplo, el usuario final ha pasado de no estar autenticado a estar autenticado y usted quiere credenciales sobre el usuario autenticado), llame a clearCredentials en su credentialsProvider.
credentialsProvider.clearCredentials()
Obtención de un token (lado del servidor)
Al llamar, se obtiene una ficha GetOpenIdTokenForDeveloperIdentity. Esta API debe invocarse desde tu back-end con las credenciales de AWS desarrollador. No debe invocarse desde el SDK de cliente. La API recibe el ID del grupo de identidades de Cognito, una asignación de inicios de sesión que contiene el nombre del proveedor de identidad como la clave y el identificador como el valor y, opcionalmente, un ID de identidad de Cognito (por ejemplo, está convirtiendo a un usuario sin autenticar en autenticado). El identificador puede ser el nombre de usuario del usuario, una dirección de correo electrónico o un valor numérico. La API responde a la llamada con un ID de Cognito único para el usuario y un token de OpenID Connect para el usuario final.
Tenga en cuenta los siguientes puntos sobre el token devuelto por GetOpenIdTokenForDeveloperIdentity:
-
Puede especificar una duración de vencimiento personalizada para el token para poder almacenarlo en la caché. Si no la proporciona, el token será válido durante 15 minutos.
-
La duración máxima del token que puede definir es de 24 horas.
-
Piense en las implicaciones para la seguridad que supone aumentar el token de duración. Si un atacante obtiene este token, puede cambiarlo por AWS credenciales para el usuario final durante el tiempo que dure el token.
En el siguiente fragmento Java, se muestra cómo inicializar un cliente de Amazon Cognito y recuperar un token para una identidad autenticada por el desarrollador.
// 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 //...
Si sigue los pasos anteriores, debe tener la posibilidad de integrar las identidades autenticadas por el desarrollador en la aplicación. Si tienes algún problema o pregunta, publica en nuestros foros
Formato de emisor de fichas regional
El token de OpenID Connect devuelto por GetOpenIdTokenForDeveloperIdentity contiene una notificación iss (del emisor). El formato de esta afirmación depende de la AWS
región del grupo de identidades.
Cuando llames GetCredentialsForIdentity (flujo mejorado), la clave del mapa de inicios de sesión debe coincidir exactamente con la iss afirmación del token.
Emisor del token por región
El valor del emisor del token depende de la región de tu grupo de identidades.
-
Regiones que utilizan el emisor global (us-east-1, us-east-2, us-west-1, us-west-2, ap-northeast-1, ap-northeast-2, 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-3, sa-east-1):
cognito-identity.amazonaws.com -
Las regiones de China (cn-north-1):
cognito-identity.cn-north-1.amazonaws.com.cn -
Todas las demás regiones comerciales: AWS
cognito-identity.region.amazonaws.com
Determinar la clave de inicio de sesión mediante programación
En lugar de codificar la clave de inicio de sesión, puedes extraerla del 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
Consideraciones sobre la migración
Si va a migrar un grupo de identidades a una región que utiliza un emisor regionalizado, tenga en cuenta lo siguiente:
-
Los clientes que codifiquen
cognito-identity.amazonaws.comcomo clave de inicio de sesión fallarán en el conjunto de identidades de la nueva región. -
El código de cliente debe actualizarse para utilizar el emisor regionalizado (
cognito-identity.) o para leer de forma dinámica lanew-region.amazonaws.comissreclamación del token (recomendado). -
Las versiones anteriores de los SDK AWS móviles codifican de forma rígida el emisor global. Esto incluye el AWS SDK para Android 2.x y versiones anteriores y el AWS SDK para iOS 2.x y versiones anteriores. Si su grupo de identidades usa un emisor regionalizado, actualícelo a una versión actual del SDK.
Conexión con una identidad social existente
Todas las vinculaciones de proveedores cuando utilices identidades autenticadas por el desarrollador deben realizarse desde tu back-end. Para conectar una identidad personalizada a la identidad social de un usuario (Login with Amazon, Sign in with Apple, Facebook o Google), añade el token del proveedor de identidad al mapa de inicios de sesión cuando llames GetOpenIdTokenForDeveloperIdentity. Para que esto sea posible, cuando llames a tu servidor desde el SDK de tu cliente para autenticar a tu usuario final, también debes pasarle el token del proveedor de redes sociales del usuario final.
Por ejemplo, si está intentando vincular una identidad personalizada a Facebook, añada el token de Facebook, además del identificador del proveedor de identidad, a la asignación de inicios de sesión cuando llame a GetOpenIdTokenForDeveloperIdentity.
logins.put("YOUR_IDENTITY_PROVIDER_NAME","YOUR_END_USER_IDENTIFIER"); logins.put("graph.facebook.com","END_USERS_FACEBOOK_ACCESSTOKEN");
Compatibilidad con la transición entre proveedores
Android
Es posible que la aplicación requiera admitir identidades sin autenticar o autenticadas mediante proveedores públicos (Login with Amazon, Sign in with Apple, Facebook o Google) junto con identidades autenticadas por el desarrollador. La diferencia fundamental entre las identidades autenticadas por el desarrollador y otras identidades (identidades sin autenticar e identidades autenticadas mediante un proveedor público) radica en la forma de obtener identityId y el token. En el caso de otras identidades, la aplicación móvil interactúa directamente con Amazon Cognito en lugar de ponerse en contacto con el sistema de autenticación. Por lo tanto, la aplicación móvil debería poder admitir dos flujos diferentes en función de la elección realizada por el usuario de la aplicación. Para esto, tendrá que realizar algunos cambios en el proveedor de identidades personalizado.
El método refresh comprueba el mapa de inicios de sesión. Si el mapa no está vacío y tiene una clave con el nombre del proveedor desarrollador, póngase en contacto con su equipo de administración. De lo contrario, llama al IdentityId método get y devuelve 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; } }
Del mismo modo, el getIdentityId método tiene dos flujos en función del contenido del mapa de inicios de sesión:
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
Es posible que la aplicación requiera admitir identidades sin autenticar o autenticadas mediante proveedores públicos (Login with Amazon, Sign in with Apple, Facebook o Google) junto con identidades autenticadas por el desarrollador. Para ello, anule el AWSCognitoCredentialsProviderHelperloginsmétodo para poder devolver el mapa de inicios de sesión correcto en función del proveedor de identidad actual. En este ejemplo se muestra cómo puede moverse entre identidades sin autenticar e identidades autenticadas mediante Facebook o por el desarrollador.
- (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]; } }
Cuando pase de identidades sin autenticar a identidades autenticadas, llame a [credentialsProvider clearCredentials]; para obligar al SDK a obtener credenciales autenticadas nuevas. Cuando cambie entre dos proveedores autenticados y no esté intentando vincularlos (por ejemplo, no proporciona tokens para varios proveedores en el diccionario de inicios de sesión), llame a [credentialsProvider
clearKeychain];. Esto borra tanto las credenciales como la identidad y obliga al SDK a obtener otras nuevas.
iOS - Swift
Es posible que la aplicación requiera admitir identidades sin autenticar o autenticadas mediante proveedores públicos (Login with Amazon, Sign in with Apple, Facebook o Google) junto con identidades autenticadas por el desarrollador. Para ello, anule el AWSCognitoCredentialsProviderHelperloginsmétodo para poder devolver el mapa de inicios de sesión correcto en función del proveedor de identidad actual. En este ejemplo se muestra cómo puede moverse entre identidades sin autenticar e identidades autenticadas mediante Facebook o por el desarrollador.
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() } }
Cuando pase de identidades sin autenticar a identidades autenticadas, llame a credentialsProvider.clearCredentials() para obligar al SDK a obtener credenciales autenticadas nuevas. Cuando cambie entre dos proveedores autenticados y no esté intentando vincularlos (por ejemplo, no proporciona tokens para varios proveedores en el diccionario de inicios de sesión), llame a credentialsProvider.clearKeychain(). Esto borra tanto las credenciales como la identidad y obliga al SDK a obtener otras nuevas.
Unity
Es posible que la aplicación requiera admitir identidades sin autenticar o autenticadas mediante proveedores públicos (Login with Amazon, Sign in with Apple, Facebook o Google) junto con identidades autenticadas por el desarrollador. La diferencia fundamental entre las identidades autenticadas por el desarrollador y otras identidades (identidades sin autenticar e identidades autenticadas mediante un proveedor público) radica en la forma de obtener identityId y el token. En el caso de otras identidades, la aplicación móvil interactúa directamente con Amazon Cognito en lugar de ponerse en contacto con el sistema de autenticación. La aplicación móvil debería poder admitir dos flujos diferentes en función de la elección realizada por el usuario de la aplicación. Para ello, tendrá que realizar algunos cambios en el proveedor de identidad personalizado.
La forma recomendada de hacerlo en Unity consiste en ampliar el proveedor de identidad desde AmazonCognitoEnhancedIdentityProvide y llamar al RefreshAsync método principal en lugar del propio AbstractCognitoIdentityProvider, en caso de que el usuario no esté autenticado con su propio servidor. Si el usuario está autenticado, puede utilizar el mismo flujo explicado anteriormente.