使用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令牌刷新门票,我看到了很多陈旧的问题,但没有一个有可行的解决方案。
答案 0 :(得分:1)
因此在考虑了这个问题之后,我意识到了一些事情。
所以掌握了这两条信息,我就能够了 [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;
}