2015-02-11 154 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; 
} 
相關問題