Instagram — изменения доступа к API

На днях (сегодня у нас 21 апреля 2015) создал новое приложение в аккаунте Instagram. И обнаружил, что опция «Signed API headers» больше недоступна.

Теперь, согласно топику, используется опция «Signed API requests». Пока что старые приложения смогут работать без изменений, а вот после 1 сентября 2015 «Signed API headers» будет убрано.

В старых приложениях настройки приватности выглядят следующим образом:

bfore

А в новом:

after

Если вы попытаетесь работать в новом приложении по старому принципу, то выскочит, что-то вроде:

Это вывод библиотеки jInstagram, которая на сегодняшний день не имеет изменений для работы по новым правилам Instagram.

Поскольку изменений скорее всего ждать придется долго, а мой проект использует библиотеку jInstagram, то придется внести изменения самостоятельно.

Приступим…

Согласно новым правилам, каждый запрос должен иметь параметр sig. Лаконичная и четкая фраза на сайте разработчиков Instagram описывает как получается параметр sig. Для этого нужно:

  1. Отсортировать все параметры вызываемого API метода Instagram в алфавитном порядке и представить в виде строк «параметр=значение» разделенных символом «|»
  2. Взять имя метода, добавить символ «|»  и добавить строку полученную в предыдущем пункте, теперь должно получиться что-то вроде: «вызываемый_метод|параметр1=значенией1|параметр2=значение2|…|параметрN=значениеN«
  3. С помощью HMAC (Hash Message Authentication Code) получить из строки код.

На деле для правки библиотеки jInstagram был добавлен класс EnforceSignedUtils со следующим содержанием:

Тут метод sinature получает имя метода, параметры метода и их значения и accessToken. Создается TreeMap для сортировки параметров по алфавиту, туда копируются все параметры. А дальше применяется алгоритм HmacSHA256 для получения кода .

В классе Instagram для хранения нашей утилиты для подписи добавлено поле:

Конструктор был заменен на:

И один метод был изменен следующим образом:

Все, что связано с «Signed Header»  было удалено из библиотеки. Теперь метод EnforceSignedRequestUtils.signature будет формировать подпись sig необходимым нам образом и добавлять ее к параметрам в методе getApiResponse. 

Нельзя сказать, что решение самое лучшее, но по мне так оно самое быстрое, а что самое главное, оно работает!

Все изменения вместе с необходимыми библиотеками лежат в этом репозитории: git@gitlab.com:Strakh/org.jinstagram.mod.git.