objective-c - 使用 AFNetworking 2.0 签署 API 请求

标签 objective-c ios7 afnetworking afnetworking-2

所以我使用 AFNetworking 来使用 API。

此 API 要求所有请求都使用 hmac 进行签名。 hmac 是根据 header 、url 和正文的组合计算得出的。然后将 hmac 作为自定义 header 添加到请求中。

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

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

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
                          completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler

当我在测试 API 服务器上模拟请求以查看我收到的 header 时,总是有 2 个额外的 header 在我签署请求时不存在:Accept-EncodingConnection,有时我也会得到 Cookie header 。

除了 hmac 签名之外,我自己添加的唯一 header 是 AcceptContent-Type 以及特定于 APIi 的自定义 header ,指示我的客户 key 。

所以我的问题是,进行此签名的最佳方式/地点是什么?

最佳答案

AFNetworking 没有添加这些 header ,NSURLSession 是(如果您切换到 AFHTTPRequestOperationManager,NSURLConnection 会)。

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

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

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

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

关于objective-c - 使用 AFNetworking 2.0 签署 API 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895889/

相关文章:

iphone - 核心数据 : multiple copies of the same item linked to another?

iOS 5 UIAlertView 自定义

ios - AFNetworking 在第一次运行时返回 null

ios - 使用 AFNetworking 的 API 请求出错

iphone - 应用程序打开时,系统是否可以删除 NSCachesDirectory 的内容?

iphone - iOS 应用程序没有使用 nib,无法启动

objective-c - iOS:什么是 Objective-C 中的事件监听器?

iphone - 切换到 iOS 7 后 UITableView 不滚动

ios - 悄悄地从我的服务器发送推送通知到我的应用程序

ios - AFNetworking 使用 HTTPS 而不是 HTTP