如何使用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前一个请求的副本,但是这次最后一个参数是错误的,因为我们不想再次检查!
successBlock
和failureBlock
与前一个请求相同。 - // 5:将操作添加到队列中。
- // 6:如果reauthorize方法失败,只调用失败块。
不幸的是,我没有find任何解决这个问题的框架,所以我写了一个简短的AFNetworking
封装(如果有人感兴趣,我可以发布在github上)逻辑是执行请求,并在http响应401
情况下,尝试刷新auth令牌以及何时完成重新执行之前的请求。
我正在寻找这个问题的答案,AFNetworking的创造者“马特”build议 :
我发现处理这个问题的最佳解决scheme是,在允许任何传出请求通过之前,使用依赖的NSOperations来检查有效的,未过期的令牌。 在这一点上,开发人员需要确定刷新令牌的最佳方法,或者首先获取新的令牌。
简单,但有效?,现在尝试,将编辑与报告…