我正在为使用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
}
}];
}
> // 1:检查http状态码,如果401尝试自动重新授权.> // 2:reauthorize是一个私有的方法,它使用AFOAuthManager刷新令牌.> // 3:在这种情况下,我们被重新授权成功,我们想重新提交上一个请求的副本.方法requestByAddingHeadersToRequest:只复制前一个请求中的所有头域.> // 4:创建上一个请求的副本,但是这次最后一个参数是false,因为我们不想再次检查! successBlock和failureBlock与以前的请求相同.> // 5:将操作添加到队列中.> // 6:如果重新授权方法失败,只需调用故障块.