Objective c 使用AFNetworking 2.0对API请求进行签名
所以我使用AFNetworking来使用API 此API要求使用hmac对所有请求进行签名。hmac通过头、url和主体的组合进行计算。然后将hmac作为自定义头添加到请求中 计算hmac并将其添加到标头中不是问题。然而,似乎在处理请求之前“在最后一分钟”添加了一些头 我的API客户端是AFHTTPSessionManager的一个子类,我一直在寻找进行签名的最佳位置,目前我正在通过重载:Objective c 使用AFNetworking 2.0对API请求进行签名,objective-c,ios7,afnetworking,afnetworking-2,Objective C,Ios7,Afnetworking,Afnetworking 2,所以我使用AFNetworking来使用API 此API要求使用hmac对所有请求进行签名。hmac通过头、url和主体的组合进行计算。然后将hmac作为自定义头添加到请求中 计算hmac并将其添加到标头中不是问题。然而,似乎在处理请求之前“在最后一分钟”添加了一些头 我的API客户端是AFHTTPSessionManager的一个子类,我一直在寻找进行签名的最佳位置,目前我正在通过重载: - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLR
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
当我在测试API服务器上模拟请求以查看接收到的头时,在我签署请求时总是有两个额外的头不存在:Accept Encoding
和Connection
,有时我还会得到Cookie
头
除了hmac签名之外,我自己添加的唯一标题是Accept
和Content-Type
,以及一个特定于APIi的自定义标题,表示我的客户密钥
所以我的问题是,进行签名的最佳方式/位置是什么?AFNetworking没有添加这些头,NSURLSession是(如果切换到AFHTTPRequestOperationManager,NSURLConnection会添加这些头) 从技术上讲,覆盖的“正确”方法是请求序列化程序子类上的
requestWithMethod:URLString:parameters:error:
,而不是AFHTTPSessionManager
。但这并不能解决您的问题,因为AFNetworking并不是添加这些头的那个。(您当前的方法也很好,只是如果您需要针对不同URL的不同行为,那么灵活性就差了)
您可能的解决方案是(依我看,从最好到最坏排序):
编辑:另一个想法-您可以尝试在
AFHTTPSessionManager
上调用settaskwillperformhtpredirectionblock:
。此时可能会添加HTTP头,因此您可以在那里重新计算hmac。(我还没有测试过,请告诉我这是怎么回事。)感谢您的反馈,很遗憾,选项1不是一个选项,我必须使用这个API,这是在他们的沙箱环境中使用它的一个要求。我一定会尝试一下选项2,然后再回复你。关于选项3,如果项目已经被放弃,我宁愿现在避免它。