我正在为受OAuth2保护的服务器编写一个小型iOS客户端。
我想知道是否可以使用AFOAuth2Manager
[here]自动刷新过期的令牌。
这个想法是当服务器用401响应时刷新客户端的逻辑,或者当刷新方法返回401时引发错误的逻辑应该是很常见的,所以可能它集成在某个库中。
我创建了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
}
}];
}
http status code
,如果401尝试自动重新授权。AFOAuthManager
刷新令牌的私有方法。requestByAddingHeadersToRequest:
方法只是复制前一个请求中的所有头字段。successBlock
和failureBlock
与之前的请求相同。不幸的是我没有找到解决这个问题的任何框架所以我写了一个关于AFNetworking
的简短包装(如果有人感兴趣我可以在github上发布)逻辑是执行请求,并且在http响应401
的情况下,尝试刷新auth-token以及何时完成重新执行先前的请求。
我正在寻找这个问题的答案和"Matt", the creator of AFNetworking, suggest this:
我发现处理这个问题的最佳解决方案是在允许任何传出请求通过之前使用依赖的NSOperations来检查有效的,未过期的令牌。此时,开发人员需要确定刷新令牌的最佳操作方法,或者首先获取新令牌。
简单,但有效?,现在尝试,将编辑报告...
使用Alamofire 4.0的Swift解决方案。基于RequestAdapter和RequestRetrier协议:example link