среда, 1 апреля 2015 г.

Как обоблачиться с YandexDisk - 2.3 Indy и HTTPS

§2.3. Indy и HTTPS


Часть I. Теория
2.1 Подключение ЯД к Windows
2.2 Создание папки приложения
2.3 Indy и HTTPS
2.4 Скрипач как прокси
2.5 Протокольные компоненты, часть 1. TidHTTP и JSON
2.5 Протокольные компоненты, часть 2. TREST~ и TDataSet
Как же нам построить программу для работы с REST API Яндекс Диска? Embarcadero предлагает нам мультиплатформенные Indy-компоненты. Но с маленькой оговоркой - они не содержат SSL-шифрования. Т.е. работа по протоколу https, который необходим ЯД (да и прочим сервисам с авторизацией), может стать несколько более сложной, чем "раз, и поехали". Причины этого нюанса лежат в юридической плоскости. Нам же нужно разобраться со следствием в разрезе работоспособности наших приложений. 

Как же нам получить возможность общения по https? (альтернативные варианты типа Synapse здесь не рассматриваются ввиду ограниченности моего кругозора) Для дооснащения Indy-компонентов полноценной поддержкой SSL фирма Embarcadero рекомендует обратиться к ресурсу OpenSSL.org. Здесь лежат Си-исходники библиотек шифрования и рекомендации по их компиляции. К счастью, на сайте есть ссылки и на библиотеки, уже откомпилированные под разные платформы. Вот взять хотя бы http://indy.fulgan.com/SSL/ - вы тоже заметили там слово "indy"? Я лично как раз поэтому и доверился ей. Там, правда, капчу требуют, но на это не стоит обижаться.


В итоге мы имеем пару DLL - libeay32.dll и ssleay32.dll в openssl-1.0.2a-i386-win32.zip для Win32, пару DLL(удивительно, но имена те же, с цифрами 32) в openssl-1.0.2a-x64_86-win64.zip для Win64 и набор для статической линковки под iOS (судя по дате, его уже давно не обновляли) -  libcrypto.a и libssl.a в OpenSSLStaticLibs.7z. А где же Андроидные бинарники? Видите ли, Андроид предоставляет стандартный доступ к шифрованию SSL, и Indy прекрасно может этим пользоваться безо всяких дополнительных приспособлений.


Что делать с DLL - понятно. Есть вариант А - надёжный: кладём их в каталог с приложением  и для дизайн-тайма в C:\Program Files (x86)\Embarcadero\Studio\версия\bin и bi64. Есть вариант Б, который выглядит гораздо предпочтительнее: выложить DLL в системный каталог - C:\Windows\System32 и C:\Windows\SysWOW64 в соответствии с разрядностью библиотек. Важное замечание по второму варианту: имейте в виду, что скорее всего DLL с такими именами у вас уже есть, но они старых версий, и в них нет всех нужных функций. Indy при этом выдаёт сообщение о том, что не удаётся загрузить библиотеки SSL. Обновите их и не забудьте перезагрузить систему. Если и это не поможет, добро пожаловать в "DLL hell"! 

Для того, чтобы запустить йОсное приложение, файлы libcrypto.a и libssl.a надо подключить к проекту через deployment, а в раздел uses добавить модуль IdSSLOpenSSLHeaders_Static, где содержатся объявления об импорте функций и некоторые прочие заголовочные штуки - непонятные, но нужные.


Теперь мы можем делать запросы по https не только в запущенном на устройстве приложении, но даже в ещё незапущенном, в режиме проектирования, прямо в ObjectInspector! 

Часть I. Теория
2.1 Подключение ЯД к Windows
2.2 Создание папки приложения
2.3 Indy и HTTPS
2.4 Скрипач как прокси
2.5 Протокольные компоненты, часть 1. TidHTTP и JSON
2.5 Протокольные компоненты, часть 2. TREST~ и TDataSet