Objective c 使用AFNetworking 2.0对API请求进行签名

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

所以我使用AFNetworking来使用API

此API要求使用hmac对所有请求进行签名。hmac通过头、url和主体的组合进行计算。然后将hmac作为自定义头添加到请求中

计算hmac并将其添加到标头中不是问题。然而,似乎在处理请求之前“在最后一分钟”添加了一些头

我的API客户端是AFHTTPSessionManager的一个子类,我一直在寻找进行签名的最佳位置,目前我正在通过重载:

- (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的不同行为,那么灵活性就差了)

您可能的解决方案是(依我看,从最好到最坏排序):

  • 将API更改为不使用hmac中的头,或者根本不使用此hmac(此hmac是否提供了HTTPS和SSL固定所没有的内容?)
  • 在请求序列化程序/会话管理器子类中手动设置这些头文件(我认为NSURL[session | Connection]不会覆盖它们)。有许多不利因素;例如,您必须使用NSHTTPCookieStorage自己管理cookie存储。你还必须希望你能得到所有的标题,因为苹果的文档没有说明他们在哪些情况下添加了哪些标题
  • 完全删除AFNetworking和NSURL[Session | Connection]并替换为基于较低级别CFNetwork框架的内容(可能是您的最佳选择。)


  • 编辑:另一个想法-您可以尝试在
    AFHTTPSessionManager
    上调用
    settaskwillperformhtpredirectionblock:
    。此时可能会添加HTTP头,因此您可以在那里重新计算hmac。(我还没有测试过,请告诉我这是怎么回事。)

    感谢您的反馈,很遗憾,选项1不是一个选项,我必须使用这个API,这是在他们的沙箱环境中使用它的一个要求。我一定会尝试一下选项2,然后再回复你。关于选项3,如果项目已经被放弃,我宁愿现在避免它。