Как автоматически обновить токен с истекшим сроком действия с помощью AFOAuth2Manager?

Я пишу небольшой клиент iOS для сервера, защищенного OAuth2.

Мне интересно, можно ли использовать AFOAuth2Manager [здесь] автообновление истекшего токена.

Идея состоит в том, что логика обновления клиента, когда сервер отвечает с помощью 401, или вызывает ошибку, когда метод refresh возвращает 401, должен быть довольно распространенным, поэтому, вероятно, он интегрирован в некоторую библиотеку.

Ответ 1

Я создал подкласс AFOAuth2Manager

В этом подклассе я переопределяю этот метод:

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
                                                    success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                                                    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure {
    return [self HTTPRequestOperationWithRequest:request
                                         success:success
                                         failure:failure
                           checkIfTokenIsExpired:YES];
}

вызов настраиваемого метода с дополнительным параметром: checkIfTokenIsExpired. Это необходимо для того, чтобы избежать бесконечных циклов.

Реализация этого метода направлена ​​вперед: если нам не нужно проверять токен, просто вызовите суперкласс.

if (!checkIfTokenIsExpired) {
        return [super HTTPRequestOperationWithRequest:request
                                              success:success
                                              failure:failure];
    }

в противном случае мы выполняем запрос с пользовательским блоком отказа

else {
        return [super HTTPRequestOperationWithRequest:request
                                              success:success
                                              failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
            if (operation.response.statusCode == ERROR_CODE_UNAUTHORIZED) { //1
                [self reauthorizeWithSuccess: ^{ //2
                    NSURLRequest *req = [self.requestSerializer requestByAddingHeadersToRequest:request]; //3
                    AFHTTPRequestOperation *moperation = [self HTTPRequestOperationWithRequest:req //4
                                                                                       success:success
                                                                                       failure:failure
                                                                         checkIfTokenIsExpired:NO];

                    [self.operationQueue addOperation:moperation]; //5
                }                    failure: ^(NSError *error) {
                    failure(nil, error);
                }];
            }
            else {
                failure(operation, error); //6
            }
        }];
    }
  • //1: проверьте http status code, если 401 попытается автоматически повторно авторизировать.
  • //2: reauthorize - это частный mathod, который использует AFOAuthManager для обновления токена.
  • //3: В этом случае мы повторно авторизованы с успехом, и мы хотим повторно отправить копию предыдущего запроса. Метод requestByAddingHeadersToRequest: просто скопирует все поля заголовка из предыдущего запроса.
  • //4: Создаем копию предыдущего запроса, но на этот раз последний параметр является ложным, потому что мы не хотим снова проверять! successBlock и failureBlock совпадают с предыдущим запросом.
  • //5: добавьте операцию в очередь.
  • //6: Если метод reauthorize выходит из строя, просто вызовите блок сбоя.

Ответ 2

К сожалению, я не нашел каких-либо фреймворков для решения этой проблемы, поэтому написал короткую обертку вокруг AFNetworking (если кому-то интересно, я могу опубликовать ее на github) Логика состоит в том, чтобы выполнить запрос, и в случае ответа HTTP 401 попробуйте обновить токен аутентификации и, когда это будет сделано для повторного выполнения предыдущего запроса.

Ответ 3

Я искал ответ на эту проблему, и Создатель AFNetworking "Matt" предлагает это:

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

Простой, но эффективный?, теперь пытается отредактировать отчет...