2014-02-20 4 views
3

Поэтому я использую AFNetworking для использования API.Подписание запросов API с использованием AFNetworking 2.0

Этот API требует, чтобы все запросы подписывались с использованием hmac. Hmac вычисляется по комбинации заголовков, url и body. Затем hmac добавляется в качестве настраиваемого заголовка запроса.

Вычисление hmac и добавление его в заголовки не является проблемой. Тем не менее, кажется, что некоторые заголовки добавляются «в последнюю минуту» перед обработкой запроса.

Мой клиент API является подклассом AFHTTPSessionManager, и я искал лучшее место, чтобы сделать подписание, и я в настоящее время делает его перегрузки:

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

Когда я имитировать запросы на тестовом сервере API, чтобы увидеть, какие заголовки я получаю, всегда есть 2 дополнительных заголовка, которых нет, когда я подписывал запрос: Accept-Encoding и Connection, иногда я также получаю заголовок Cookie.

Единственные заголовки, которые я добавляю, помимо подписи hmac, являются Accept и Content-Type и пользовательский заголовок, специфичный для APIi, указывающий мой ключ клиента.

Итак, мой вопрос: какой лучший способ/место для этого подписания?

ответ

1

AFNetworking не добавляет эти заголовки, NSURLSession (и NSURLConnection будет, если вы переключитесь на AFHTTPRequestOperationManager).

Технически «правильный» метод для переопределения - requestWithMethod: URLString: parameters: error: по вашему запросу подкласс последователя, а не ваш AFHTTPSessionManager. Но это не решит вашу проблему, поскольку AFNetworking не является тем, кто добавляет эти заголовки. (Ваш текущий подход также прекрасен, он менее гибкий, если вам нужно другое поведение для разных URL-адресов).

Ваши возможные решения (упорядоченные от лучшего к худшему, на мой взгляд):

  1. Изменение API не использовать заголовки в HMAC, или не использовать этот HMAC вообще (делает это HMAC дать вам что-нибудь, что HTTPS и SSL Закрепление не)
  2. вручную установить эти заголовки в запросе сериализатору/Session Manager подкласса (я не думать NSURL [Session | Connection]? перекроет их) , Существует ряд недостатков; например, вам придется самостоятельно управлять хранилищем файлов cookie, используя NSHTTPCookieStorage. Вы также должны надеяться, что вы их получите, так как в документации Apple не говорится, какие заголовки они добавляют в каких случаях.
  3. Полностью удалить AFNetworking и NSURL [Session | Connection] целиком, и заменить его на что-то на основе структуры CFNetwork нижнего уровня (long-abandoned ASIHTTPRequest library может быть вашим лучшим выбором.)

EDIT: Еще одна идея - вы можете попробовать позвонить setTaskWillPerformHTTPRedirectionBlock: на свой AFHTTPSessionManager. Заголовки HTTP могут быть добавлены в этот момент, поэтому вы можете пересчитать hmac. (Я не проверял это, пожалуйста, дайте мне знать, как это получается.)

+0

Благодарим за отзыв, к сожалению, вариант 1 не является вариантом, я должен использовать этот API, и это требование использовать его из среды их песочницы. Я обязательно сделаю снимок в варианте 2 и вернусь к вам. Что касается варианта 3, если проект был оставлен, я бы скорее его избежал. – YoGiN

+0

@YoGiN Смотрите мои обновленные изменения и дайте мне знать, если это сработает. –

Смежные вопросы