Obtener un token de ID de cliente cruzado para AWS desde el SDK de inicio de sesión de Google

2

Estoy tratando de integrar Google con Amazon Cognito en una aplicación de iOS usando el SDK de inicio de sesión de Google, pero parece que no puedo averiguar cómo obtener el token de identificación de JWT correctamente. Creo que todo está configurado correctamente, ya que tanto el inicio de sesión de Google como Cognito funcionan de forma independiente.

Estoy configurando el GIDSignIn de esta manera.

[GIDSignIn sharedInstance].scopes = @[kGTLAuthScopePlusLogin, kGTLAuthScopeDrive];
[[GIDSignIn sharedInstance] setClientID:kClientID];
[GIDSignIn sharedInstance] setServerClientID:kServerClientId];

y luego para obtener el id_token, como se especifica aquí, con la excepción de que estoy usando el inicio de sesión de Google y no el inicio de sesión de Google+, que no tiene GTMOAuth2Authentication.

- (void)googleSignedIn:(GIDGoogleUser *) user
    {
    NSLog(@"AWSManager: Google signed in, id token = %@", user.authentication.idToken);
    NSString *idToken = user.authentication.idToken;
    self.credentialsProvider.logins = @{ @(AWSCognitoLoginProviderKeyGoogle): idToken};

pero el idtoken no es un token web con formato json, es solo un trozo de caracteres. AWS arroja este error:

AWSiOSSDKv2 [Error] AWSIdentityProvider.m line:185 
| __51-[AWSAbstractCognitoIdentityProvider getIdentityId]_block_invoke169 
| GetId failed. 

Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=9 
"The operation couldn’t be completed. (com.amazonaws.AWSCognitoIdentityErrorDomain error 9.)" 
UserInfo=0x8fa5eb8e4e40{__type=NotAuthorizedException, message=Token is not from a supported provider of this identity pool.}]

No tengo ni idea de lo que voy a hacer. Soy bastante nuevo en Objective-C y he hecho todo esto en Android antes. En Android lo hice:

   String mServerClientId = "audience:server:client_id:xxxxxxxxxx.apps.googleusercontent.com"
   String token = GoogleAuthUtil.getToken(getApplicationContext(), accountName, mServerClientId);

para recuperar los tokens, pero por lo que puedo decir, no hay nada de eso en iOS. Puedo proporcionar más información si es necesario.

¡Gracias!

8

Por el error, parece que el clientId no está configurado correctamente en la configuración del grupo de identidades. Google tiene diferentes identificadores de cliente para cada plataforma, para admitir múltiples identificadores de cliente, debe usar el soporte de Cognito para proveedores de identidad OpenID Connect genéricos. Siga estos pasos:

  1. Vaya a la sección de proveedores de identidad de la consola de AWS IAM.
  2. Cree un proveedor de identidad de OpenId Connect con la URL del proveedor como https://accounts.google.com y Audience como uno de los ID de cliente.
  3. Siga los pasos para crear un proveedor de identidad y luego tendrá la opción de agregar identificadores de cliente adicionales.
  4. Vaya a la consola de Amazon Cognito.
  5. Cree o edite un grupo de identidades y agregue el proveedor de identidad de conexión OpenID al grupo. Esto le permitirá confiar en múltiples ID de clientes.

Puede seguir la documentación de Cognito para el inicio de sesión de Google aquí y los proveedores de conexión OpenID aquí .

Además, el token que está obteniendo está codificado en Base64. Tiene tres partes separadas por un punto.

  1. El algoritmo que se utiliza.
  2. La carga útil.
  3. La firma que valida Cognito.

Puedes usar esta genial herramienta para decodificar los tokens.

Gracias,
Rachit

1
  • Muchas gracias. ¡Tengo todo funcionando! El token de inicio de sesión codificado en base64 realmente me desconcertó. Tenías toda la razón en que necesitaba configurar un OpenId en lugar de usar las credenciales de Google+ como lo hice en Android. 11/06/15 a las 21:21