2015-02-11 7 views
1

Работа с iPhone-приложением Я использую Google Plus SDK (GPPSignIn) для получения и обновления токенов аутентификации.iOS Обработка запросов с обновленными токенами аутентификации

Эти токены продолжаются в течение 1 часа. Когда я делаю запрос с истекшим токеном, веб-служба, которую я использую, возвращает конкретный код ответа HTTP, чтобы я знал, что мой токен истек.

После получения ответа, который закончился мой токен, я делаю звонок, чтобы обновить токен аутентификации. Теперь я хотел бы повторить запрос к веб-службе с новым токеном. И я хотел бы сделать это все в моем объекте запроса сервера.

Если я сам программировал все работы, я мог бы просто сделать запрос для обновления токена встроенным с запросом веб-сервера и после выполнения запроса токена, я мог бы продолжить запрос веб-сервера. Но поскольку работа с токеном осуществляется через SDK Google Plus, и они используют модель делегата для связи с завершением запроса аутентификации, я не знаю, как удерживать запрос в веб-службе до тех пор, пока токен не будет обновлен.

В настоящее время я пытаюсь создать «очень плохую» идею, которая показана ниже, где я пытаюсь поместить мой запрос в новый поток, а затем наложить этот поток на некоторое время, после чего он просыпается и мы надеемся, что новый токен доступен. Но должен быть лучший способ!

   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. Я действительно хотел иметь [клиент silentGoogleAuthentication]; вызов делает всю свою обработку встроенной. И, копаясь дальше в коде, я обнаружил, что даже несмотря на то что GPPSSignIn trySilentAuthentication поддерживает делегат, но он также возвращает логическое значение, когда оно выполняется самой обработкой.
  2. Мой процесс уже работает за пределами основного потока, поэтому делегат имеет очень мало значения для меня.
  3. GPPSSign использует общий экземпляр, поэтому, если обработка выполнена, я могу вызвать общий экземпляр и напрямую получить результаты.

Так что с этими двумя частями информации в руке я смог в стороне от [клиент 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; 
}