1

在 iPhone 应用程序上工作时,我使用 Google Plus SDK (GPPSignIn) 来获取和刷新身份验证令牌。

这些令牌持续 1 小时。当我使用过期令牌发出请求时,我正在使用的 Web 服务会返回特定的 http 响应代码,以便我知道我的令牌已过期。

在收到我的令牌已过期的响应后,我会调用以刷新身份验证令牌。现在我想使用新令牌重复对 Web 服务的请求。我想在我的服务器请求对象中完成这一切。

如果我自己编写整个工作,我可以将令牌刷新请求与 Web 服务器请求内联,当令牌请求完成后,我可以继续处理 Web 服务器请求。但由于令牌工作是通过 Google Plus SDK 完成的,并且他们使用委托模型来传达身份验证请求的完成情况,所以在刷新令牌之前,我不知道如何将请求保存到 Web 服务。

目前我正在尝试一个“非常糟糕”的想法,如下所示,我尝试将我的请求放入一个新线程,然后让该线程休眠一段时间,此时它会醒来,我们希望新令牌可用。但是必须有更好的方法!

             if (error !=nil && error.code == NSURLErrorUserCancelledAuthentication) {
             //special handling of 401, which may be a Google Auth token failure.
             // if it is, then let's go get a new token.

                 User *client = [[User alloc] init];

                 if(client.email != nil && client.password != nil){

                     if (client.accountType == AuthTypeGoogle) {
                         NSLog(@"attempt to get a new token");

                         // request new token
                         [client silentGoogleAuthentication];

                         //repeat request
                         if (repeatableRequest) {
                             dispatch_async(repeatQueue, ^{
                                     [NSThread sleepForTimeInterval:4];
                                     NSLog(@"sleepytime");
                                     [self assignCredentialstoRequest];
                                     [self makeRequest:notificationName repeatableRequest:false];

                             });

                         }
                     }
                 }
             }

任何指针将不胜感激。我查看了一些 iOS 令牌刷新票,我看到了很多陈旧的问题,但没有一个可行的解决方案。

4

1 回答 1

1

所以在思考了这个问题之后,我意识到了一些事情。

  1. 我真正想要的是拥有 [client silentGoogleAuthentication]; 调用做所有的内联处理。进一步深入研究代码,我发现即使它是 GPPSSignIn trySilentAuthentication 支持委托,但它在完成自身处理时也会返回一个布尔值。
  2. 我的进程已经在主线程之外运行,所以委托对我来说几乎没有价值。
  3. GPPSSign 使用共享实例,因此如果处理完成,我可以调用共享实例并直接访问结果。

因此,有了这两条信息,我就可以在 [client silentGoogleAuthentication]; 调用捕获 trySilentAuthentication 调用的结果,然后将结果分配到代码中的正确位置,然后将布尔值返回给初始调用 [client silentGoogleAuthentication] 的函数并继续。像这样:

    // Try signing in silently so user doesn't have to be prompted again
BOOL authResponse = [signIn trySilentAuthentication];
if (authResponse) {
    NSLog(@"successful auth");
    NSLog(@"idToken is %@", [GPPSignIn sharedInstance].idToken);
    self.accountType = AuthTypeGoogle;
    self.password = [GPPSignIn sharedInstance].idToken;
    [self updateCredentials];
    return true;
} else {
    return false;
}
于 2015-02-15T04:33:08.200 回答