更新2015-10-28 - 发布2.4.0的谷歌登录iOS似乎已经解决了这个问题,新的GIDAuthentication方法getTokensWithHandler:和refreshTokensWithHandler:会根据需要更新idToken和accessToken。GIDSignIn方法SignInSilently还刷新两个标记。
我正在为iOS使用AWS,并且我使用AWS认知同步示例代码作为基础实现了作为认知凭证提供者的谷歌登录。登录(以及随后的静默登录)流正常工作,登录用户可以按预期访问AWS资源,如DynamoDB。
我的问题是,user.authentication.idToken在一个小时后到期,此时对AWS服务的调用会出现身份验证错误。我可以使用以下方法刷新user.authentication.accessToken
[self.googleUser.authentication refreshAccessTokenWithHandler:^(NSString *accessToken, NSError *error) {...}但这并不能更新idToken。我也试过打电话
[[GoogleSignIn sharedInstance] signInSilently];这给了我一个有效的idToken,当它第一次在会话中被调用时,但是尽管它成功地完成了,但是它不会在同一个会话中的后续调用中刷新idToken。
我一直在使用
https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<idToken>和
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<accessToken>我不确定问题是GIDSignIn没有更新idToken,还是AWS应该以某种方式使用refreshToken在后端自动刷新用户。不管是哪种方式,我都没有想法了。
下面的代码片段。我使用GoogleSignIn 2.2.0和2.3.2进行了测试,并遇到了同样的问题。
...
@interface MySignInClass <GIDSignInDelegate>
...
-(void) signInWithGoogle
{
GIDSignIn *signIn = [GIDSignIn sharedInstance];
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.credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
initWithRegionType:MY_COGNITO_REGION_TYPE
identityId:nil
identityPoolId:MY_COGNITO_IDENTITY_POOL
logins:logins];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc]
initWithRegion:MY_COGNITO_REGION
credentialsProvider:self.credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
// AWSTask stuff removed for simplicity
AWSTask* task = [self.credentialsProvider getIdentityId];
...
}
}
...
- (void)signIn:(GIDSignIn *)signIn
didDisconnectWithUser:(GIDGoogleUser *)user
withError:(NSError *)error
{
[self handleGoogleSignout]; // Do signout stuff
}
...发布于 2015-10-26 23:30:34
请按如下方式调用GIDSignIn的signInSilently方法:
[[GIDSignIn sharedInstance] signInSilently];这将导致再次使用signIn:didSignInForUser:withError:调用idToken委托方法实现。
我已经证实,使用2.4.0发布谷歌iOS登录,上述使用signInSilently的方法确实可以为您提供一个未过期的新idToken。
发布于 2015-10-22 11:50:36
我也有这个问题。尝试了一切可能的方法,这个令牌根本没有被G+ iOS SDK更新。
我们这边的解决方案是将refresh_token发送到我们的服务器上,他们能够通过访问一个Google并将新的令牌发送回我的应用程序,从而正确地更新他们这一方的令牌。不幸的是,我现在无法访问那里,告诉您确切的哪个API,只有明天。
发布于 2016-03-19 03:01:52
在30分钟内使用计时器,然后调用signInSilently怎么样?
https://stackoverflow.com/questions/33279485
复制相似问题