2014-02-20 75 views
3

所以我使用AFNetworking来使用API​​。使用AFNetworking 2.0签署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

AFNetworking不添加这些标头,NSURLSession是(和NSURLConnection如果你切换到AFHTTPRequestOperationManager)。

从技术上讲,要求覆盖的“正确”方法是请求序列化器子类中的requestWithMethod: URLString: parameters: error:,而不是AFHTTPSessionManager。但是这并不能解决你的问题,因为AFNetworking不是添加这些头文件的人。 (如果您需要针对不同网址的不同行为,您目前的方法也很好,但不够灵活)。

你可能的解决方案(从最责令最差的,在我看来):

  1. 更改API在HMAC不使用标题,或根本不使用该HMAC(不这HMAC给你任何东西,HTTPS和SSL钢钉不)
  2. 手动在您的请求串行/会话管理器子设置这些报头(我不认为 NSURL [会话|连接]?它们会被覆盖) 。有一些缺点;例如你必须使用NSHTTPCookieStorage自己管理cookie存储。你也必须希望你能得到所有这些,因为Apple的文档没有说明在哪些情况下添加了哪些头文件。
  3. 彻底清除AFNetworking和NSURL [会话|连接]完全,并与基于低层CFNetwork框架的东西取代它(long-abandoned ASIHTTPRequest library可能是你最好的选择。)

编辑:另一个想法 - 你可以尝试在AFHTTPSessionManager上拨打setTaskWillPerformHTTPRedirectionBlock:。 HTTP标头可能会在此时添加,因此您可以重新计算那里的hmac。 (我还没有测试过,请让我知道这是如何解决的。)

+0

感谢您的反馈意见,不幸的是选项1不是选项,我必须使用这个API,并且这是要求在沙箱环境中使用它。 我一定会对选项2做出反应,然后回复你。关于方案3,如果项目已经放弃,我宁愿现在就避免它。 – YoGiN

+0

@YoGiN看到我更新的编辑,并让我知道,如果这有效。 –