¿Cómo actualizar authentication.idToken con GIDSignIn o GIDAuthentication?

ACTUALIZACIÓN 28-10-2015: la versión 2.4.0 del inicio de session de Google para iOS parece haber resuelto este problema, tanto si el idToken como el accessToken se actualizan según sea necesario mediante los nuevos methods GIDAuthentication getTokensWithHandler: y refreshTokensWithHandler: Método SignInSilently también actualiza ambos tokens.


Estoy utilizando AWS Mobile SDK para iOS, e implementé el inicio de session de Google como proveedor de cnetworkingenciales de Cognito utilizando el código de ejemplo de AWS Cognito Sync como base. El flujo de inicio de session (y subsiguiente logging silencioso) funciona correctamente y los usuarios con acceso pueden acceder a los resources de AWS como DynamoDB según lo previsto.

Mi problema es que user.authentication.idToken expira después de una hora y en ese momento las llamadas a los services de AWS fallan con errores de authentication. Puedo actualizar el user.authentication.accessToken usando

 [self.googleUser.authentication refreshAccessTokenWithHandler:^(NSString *accessToken, NSError *error) {...} 

pero esto no actualiza el idToken . También intenté llamar

 [[GoogleSignIn shanetworkingInstance] signInSilently]; 

que me da un idToken válido la primera vez que se llama en la session, pero aunque se completa con éxito, no actualiza el idToken en las llamadas subsiguientes dentro de la misma session.

He estado revisando / volcando los contenidos del token usando

 https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<idToken> 

y

 https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<accessToken> 

No estoy seguro de si el problema es que GIDSignIn no está actualizando idToken, o que AWS debería usar el refreshToken de alguna manera para actualizar automáticamente el usuario en el back-end. De cualquier manera, me faltan ideas.

Fragmentos de código a continuación. He probado usando GoogleSignIn 2.2.0 y 2.3.2 y he experimentado el mismo problema.

 ... @interface MySignInClass <GIDSignInDelegate> ... -(void) signInWithGoogle { GIDSignIn *signIn = [GIDSignIn shanetworkingInstance]; signIn.clientID = MY_GOOGLE_CLIENT_ID; signIn.shouldFetchBasicProfile = YES; signIn.scopes = [NSArray arrayWithObjects:@"https://www.googleapis.com/auth/userinfo.profile", @"openid", nil]; signIn.delegate = self; if([signIn hasAuthInKeychain]) { [signIn signInSilently]; } else { [signIn signIn]; } } ... - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error { if (error != nil) { [self handleSignInError:error]; // Handle error } else { NSString *idToken = user.authentication.idToken; NSDictionary* logins = @{@"accounts.google.com": idToken}; self.cnetworkingentialsProvider = [[AWSCognitoCnetworkingentialsProvider alloc] initWithRegionType:MY_COGNITO_REGION_TYPE identityId:nil identityPoolId:MY_COGNITO_IDENTITY_POOL logins:logins]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:MY_COGNITO_REGION cnetworkingentialsProvider:self.cnetworkingentialsProvider]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration; // AWSTask stuff removed for simplicity AWSTask* task = [self.cnetworkingentialsProvider getIdentityId]; ... } } ... - (void)signIn:(GIDSignIn *)signIn didDisconnectWithUser:(GIDGoogleUser *)user withError:(NSError *)error { [self handleGoogleSignout]; // Do signout stuff } ... 

Llame al método signInSilently de GIDSignIn como sigue :

 [[GIDSignIn shanetworkingInstance] signInSilently]; 

Esto terminará llamando a su signIn:didSignInForUser:withError: delegue la implementación del método con el idToken nuevamente.

He verificado que con la versión 2.4.0 de Google Sign-In para iOS, el enfoque anterior de usar signInSilently realmente funciona para darle un nuevo idToken que no ha caducado.

También tuve este problema. Intenté todo lo posible, ese token simplemente no está siendo renovado por G + iOS SDK.

La solución de nuestro lado era enviar refresh_token a nuestro server, y pudieron renovar correctamente el token de su lado, accediendo a una API de Google y luego enviando el token nuevo a mi aplicación. Desafortunadamente no tengo acceso ahora, para decirte exactamente qué API, solo mañana.

¿Qué hay de utilizar un timer en 30 minutos, y luego llamar al signoInsilentemente?