2014-02-20 93 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看到我更新的編輯,並讓我知道,如果這有效。 –