2015-02-11 158 views
1

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

这些标记持续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令牌刷新票据,并发现很多陈旧的问题,但没有一个提供可行的解决方案。

回答

1

因此,在对这个问题进行了一些思考后,我意识到了一些事情。

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

因此,对于这两条信息,我可以在 [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; 
} 
相关问题