在 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 令牌刷新票,我看到了很多陈旧的问题,但没有一个可行的解决方案。