首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用GIDSignIn或GIDAuthentication刷新GIDSignIn?

如何用GIDSignIn或GIDAuthentication刷新GIDSignIn?
EN

Stack Overflow用户
提问于 2015-10-22 11:03:18
回答 3查看 5.1K关注 0票数 5

更新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

代码语言:javascript
复制
[self.googleUser.authentication refreshAccessTokenWithHandler:^(NSString *accessToken, NSError *error) {...}

但这并不能更新idToken。我也试过打电话

代码语言:javascript
复制
[[GoogleSignIn sharedInstance] signInSilently];

这给了我一个有效的idToken,当它第一次在会话中被调用时,但是尽管它成功地完成了,但是它不会在同一个会话中的后续调用中刷新idToken。

我一直在使用

代码语言:javascript
复制
https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<idToken>

代码语言:javascript
复制
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<accessToken>

我不确定问题是GIDSignIn没有更新idToken,还是AWS应该以某种方式使用refreshToken在后端自动刷新用户。不管是哪种方式,我都没有想法了。

下面的代码片段。我使用GoogleSignIn 2.2.0和2.3.2进行了测试,并遇到了同样的问题。

代码语言:javascript
复制
...
@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
}
...
EN

回答 3

Stack Overflow用户

发布于 2015-10-26 23:30:34

请按如下方式调用GIDSignIn的signInSilently方法

代码语言:javascript
复制
[[GIDSignIn sharedInstance] signInSilently];

这将导致再次使用signIn:didSignInForUser:withError:调用idToken委托方法实现。

我已经证实,使用2.4.0发布谷歌iOS登录,上述使用signInSilently的方法确实可以为您提供一个未过期的新idToken。

票数 2
EN

Stack Overflow用户

发布于 2015-10-22 11:50:36

我也有这个问题。尝试了一切可能的方法,这个令牌根本没有被G+ iOS SDK更新。

我们这边的解决方案是将refresh_token发送到我们的服务器上,他们能够通过访问一个Google并将新的令牌发送回我的应用程序,从而正确地更新他们这一方的令牌。不幸的是,我现在无法访问那里,告诉您确切的哪个API,只有明天。

票数 0
EN

Stack Overflow用户

发布于 2016-03-19 03:01:52

在30分钟内使用计时器,然后调用signInSilently怎么样?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33279485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档