所以我使用AFNetworking来使用API。
此API要求使用hmac对所有请求进行签名。 hmac是通过标题,网址和正文的组合计算的。然后将hmac作为自定义标头添加到请求中。
计算hmac并将其添加到标题中不是问题。但是,似乎在处理请求之前,“在最后一刻”添加了一些标题。
我的API客户端是AFHTTPSessionManager
的子类,我一直在寻找签名的最佳位置,我目前正在通过重载来实现:
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
当我在测试API服务器上模拟请求以查看我收到的标头时,我签署请求时总会有2个其他标头:Accept-Encoding
和Connection
,有时我也会得到Cookie
标题。
除了hmac签名之外,我自己添加的唯一标头是Accept
和Content-Type
以及特定于APIi的自定义标头,表示我的客户密钥。
所以我的问题是,签署此协议的最佳方式/地点是什么?
答案 0 :(得分:1)
AFNetworking没有添加这些标题,NSURLSession是(如果您切换到AFHTTPRequestOperationManager,则为NSURLConnection)。
从技术上讲,要覆盖的“正确”方法是requestWithMethod: URLString: parameters: error:
请求序列化程序子类,而不是AFHTTPSessionManager
。但这不会解决您的问题,因为AFNetworking不是添加这些标头的人。 (您当前的方法也很好,如果您需要针对不同URL的不同行为,则不太灵活。)
您可能的解决方案(在我看来,从最好到最差排序):
编辑:另一个想法 - 您可以尝试在setTaskWillPerformHTTPRedirectionBlock:
上致电AFHTTPSessionManager
。此时可能会添加HTTP标头,因此您可以在那里重新计算hmac。 (我没有测试过这个;请告诉我这是如何工作的。)