如何使用AFOAuth2Manager自动刷新过期的标记?

我正在为使用OAuth2保护的服务器编写一个小型的iOS客户端。

我想知道是否有可能使用AFOAuth2Manager [这里]自动刷新过期的标记。

这个想法是,当服务器响应401时刷新客户端的逻辑,或刷新方法返回401时产生错误的逻辑应该是相当常见的,所以可能将其集成到某个库中。

我创build了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:重新授权是使用AFOAuthManager刷新令牌的私有方法。
  • // 3:在这种情况下,我们被重新授权成功,我们希望重新提交前一个请求的副本。 requestByAddingHeadersToRequest:方法requestByAddingHeadersToRequest:只复制前一个请求中的所有头字段。
  • // 4:创build前一个请求的副本,但是这次最后一个参数是错误的,因为我们不想再次检查! successBlockfailureBlock与前一个请求相同。
  • // 5:将操作添加到队列中。
  • // 6:如果reauthorize方法失败,只调用失败块。

不幸的是,我没有find任何解决这个问题的框架,所以我写了一个简短的AFNetworking封装(如果有人感兴趣,我可以发布在github上)逻辑是执行请求,并在http响应401情况下,尝试刷新auth令牌以及何时完成重新执行之前的请求。

我正在寻找这个问题的答案,AFNetworking的创造者“马特”build议 :

我发现处理这个问题的最佳解决scheme是,在允许任何传出请求通过之前,使用依赖的NSOperations来检查有效的,未过期的令牌。 在这一点上,开发人员需要确定刷新令牌的最佳方法,或者首先获取新的令牌。

简单,但有效?,现在尝试,将编辑与报告…