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 } }]; }
http status code
, si 401 essaie de le réautoriser automatiquement. AFOAuthManager
pour actualiser le jeton. requestByAddingHeadersToRequest:
suffit de copyr tous les champs d'en-tête de la requête précédente. successBlock
et failureBlock
sont identiques à la requête précédente. 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 …