Comment actualiser automatiquement le jeton expiré avec AFOAuth2Manager?

J'écris un petit client iOS pour un server protégé avec OAuth2.

Je me request si c'est possible en utilisant AFOAuth2Manager [ici] auto-rafraîchir le jeton expiré.

L'idée est que la logique pour rafraîchir le client lorsque le server répond avec un 401, ou triggersr une erreur lorsque la méthode d'actualisation renvoie un 401 devrait être assez commune, donc il est probablement embedded dans une bibliothèque.

J'ai créé une sous-class de AFOAuth2Manager

Dans cette sous-class, je remplace cette méthode:

 - (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]; } 

appeler une méthode personnalisée avec un paramètre supplémentaire: checkIfTokenIsExpired . Ceci est nécessaire pour éviter les loops infinies.

L'implémentation de cette méthode est la plus avancée: si nous n'avons pas besoin de vérifier le jeton, appelez simplement la super class.

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

sinon, nous effectuons la request avec un bloc de défaillance personnalisé

 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: vérifie le http status code , si 401 essaie de le réautoriser automatiquement.
  • // 2: reauthorize est un mathod privé qui utilise AFOAuthManager pour actualiser le jeton.
  • // 3: Dans ce cas, nous sums réautorisés avec succès et nous souhaitons renvoyer une copy de la request précédente. La méthode requestByAddingHeadersToRequest: suffit de copyr tous les champs d'en-tête de la requête précédente.
  • // 4: Crée une copy de la requête précédente, mais cette fois le dernier paramètre est faux car nous ne voulons pas vérifier à nouveau! Les successBlock et failureBlock sont identiques à la requête précédente.
  • // 5: ajoute l'opération à la queue.
  • // 6: Si la méthode reauthorize échoue, il suffit d'appeler le bloc d'échec.

Malheureusement, je n'ai pas trouvé de cadre pour résoudre ce problème, j'ai donc écrit une courte enveloppe autour de AFNetworking (si quelqu'un est intéressé je peux publier sur github) La logique est d'exécuter la requête, et dans le cas de la réponse http 401 , essayez de rafraîchir l'auth-token et quand c'est fait pour ré-exécuter la requête précédente.

Je cherchais une réponse à ce problème et "Matt", le créateur de AFNetworking, suggère ceci :

La meilleure solution que j'ai trouvée pour gérer cela est d'utiliser NSOperations dépendantes pour vérifier un jeton valide, non expiré, avant que toute request sortante puisse passer. À ce stade, il appartient au développeur de déterminer la meilleure façon d'actualiser le jeton ou d'en acquérir un nouveau en premier lieu.

Simple, mais efficace ?, essayant maintenant, éditera avec le rapport …