使用AFNetworking 2.0签署API请求

时间:2014-02-20 00:49:51

标签: objective-c ios7 afnetworking afnetworking-2

所以我使用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-EncodingConnection,有时我也会得到Cookie标题。

除了hmac签名之外,我自己添加的唯一标头是AcceptContent-Type以及特定于APIi的自定义标头,表示我的客户密钥。

所以我的问题是,签署此协议的最佳方式/地点是什么?

1 个答案:

答案 0 :(得分:1)

AFNetworking没有添加这些标题,NSURLSession是(如果您切换到AFHTTPRequestOperationManager,则为NSURLConnection)。

从技术上讲,要覆盖的“正确”方法是requestWithMethod: URLString: parameters: error:请求序列化程序子类,而不是AFHTTPSessionManager。但这不会解决您的问题,因为AFNetworking不是添加这些标头的人。 (您当前的方法也很好,如果您需要针对不同URL的不同行为,则不太灵活。)

您可能的解决方案(在我看来,从最好到最差排序):

  1. 将您的API更改为不使用hmac中的标题,或者根本不使用此hmac(这个hmac是否为您提供了HTTPS和SSL Pinning不支持的任何内容?)
  2. 在请求序列化程序/会话管理器子类中手动设置这些标头(我不认为 NSURL [会话|连接]将覆盖它们)。有许多缺点;例如,您必须使用NSHTTPCookieStorage自行管理cookie存储。你也必须希望你得到所有这些,因为Apple的文档没有说明他们在哪些情况下添加了哪些标题。
  3. 完全删除AFNetworking和NSURL [会话|连接] ,并将其替换为基于较低级别CFNetwork框架的内容(long-abandoned ASIHTTPRequest library可能是您最好的选择。)< / LI>

    编辑:另一个想法 - 您可以尝试在setTaskWillPerformHTTPRedirectionBlock:上致电AFHTTPSessionManager。此时可能会添加HTTP标头,因此您可以在那里重新计算hmac。 (我没有测试过这个;请告诉我这是如何工作的。)