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