Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Як авторизуватися у відкритому API Електронного кабінету?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Кумарить через оглядач авторизуватися там щоразу, щоб просто подивитися, як мої податки й статус єдинника поживають. Бачу на головній: новина, у нас тепер відкритий API! Ну, думаю, зараʼ скрипта зроблю й ним хутенько щодня че́катиму. Еге.

Документація:

curl 'https://cabinet.tax.gov.ua/ws/public_api/ta/splatp?year=2020' -i -X GET \
    -H 'Content-Type: application/json' \
    -H 'Authorization: MIIStwYJKoZIhvcNAQ...
    -H 'Accept: application/json'

Дуже інформативно обрубано.

Авторизація — в header запиту Authorization ЄДРПОУ/РНОКПП підписаний внутрішнім підписом з додаванням сертифікату в BASE64

Що це, kr̥wa, означає, це гуманітаріями писане? Додавання — це конкатенація? До підписування чи після?

Сам Електронний кабінет запитує дані з приватного API, і авторизується инакше: рядком вигляду «Bearer <якийсь UUID>». Ці UUID тимчасові; токен, отриманий на cabinet.tax.gov.ua/user/settings, не підходить теж. Тож звідти рядок авторизації видерти не вийде.

Доведеться у ДержРадПобСоюзТрестКриптографії розбиратися, щоб просто підписати ключем ІПН?

А, і от ще цікавинка:

Ну ліпше вже така документація, ніж ніяка, еге. Головне, що не Silverlight!

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Добрий день, вдалось відправити запит?

З видертими з самого Кабінету рядками авторизації деякий час працює.

Розбиратися, як ще й вони генеруються — мотивації замало, у мене ще не настільки той Кабінет у печінках сидить ☺

Вроде работает их публичное апи. Нужно подписать строку из вашего ЕДРПОУ или ИПН. Плейграунд подписания можно попробовать этот js.sign.eu.iit.com.ua. В запросах в заголовок Authorization пишите значение base64 представления подписи. Обязательно ставьте флаги додавання сертифікату, та позначки часу. Подпись актуальна вроде 1 час с момента получения метки

Привет, токен нужно получить в личном кабинете:
— ссылка (cabinet.tax.gov.ua/user/settings)
— пункт (Токени відкритої частини)

Чукча не читатель? ;)

токен, отриманий на cabinet.tax.gov.ua/user/settings, не підходить теж

И кусок строки в примере не похож на токен в чистом виде: там явно base64, а не UUID.

Добрий день. Вам вдалося розібратися в цій документації?

Ні, ідею полишено до ліпших часів.

Бо якщо тут справді потрібна ДСТУ-криптографія, то реалізація вийде далеко за рамки простого скрипта, попри відкритий API.

Не могли же разработчики этого апи сделать прямо уникальную авторизацию для него =)

Открываем Dev Tools браузера, при входе в кабинет смотрим на запросы и видим:

https://cabinet.tax.gov.ua/ws/auth/oauth/token?grant_type=password&username=XXX&password=%long_auth_password%

Собственно %long_auth_password% и есть тот самый «ЄДРПОУ/РНОКПП пiдписаний внутрiшнiм пiдписом з додаванням сертифiкату в BASE64»

Угу, только для его срабатывания должна в заголовке Authorization быть строка вида Basic блабла, где блабла — base64 от какого-то хэша капсом без минусов, два раза и через двоеточие (лол, зачем?) Остаётся ещё разобраться, откуда он берётся.

И не тянет ли уже всё это на нарушение ToS из-за реверс-инжиниринга? ;)

В первом приближение и так сойдёт =) Пароль этот инвалидироваться не должен, так что достаточно его один раз скопировать и всё. Но да, это всё же не user-friendly.

Посмотреть в отправляемые запросы уж точно на нарушение не потянет. А вот если де-обфусцировать их сорцы — то может что-то и нарушать.

Ну ладно — тот хэш, видимо, тоже не меняется.

Пока наклёвывается такое:

#!/bin/sh
TOKEN=$(curl -s 'https://cabinet.tax.gov.ua/ws/auth/oauth/token?grant_type=password&username=<инн>-<инн>-<какой-то таймстамп?>&password=<АААААААААААРАЗОРВИЭКРАНАААААААААААААААААААА>' \
  -X 'POST' \
  -H 'Authorization: Basic <тот самый base64 от двойного хэша>' \
  --compressed|jq -r '.access_token')
curl -s 'https://cabinet.tax.gov.ua/ws/api/payer_card'  -X GET \
    -H 'Content-Type: application/json' \
    -H 'Authorization: '"$TOKEN" \
    -H 'Accept: application/json'|jq '.[]|select(.idGroup==6).values'

А вот похоже этот password таки меняется, теперь мне выдаёт
{"error":"Помилка","error_description":"Помилка перевірки підпису:хибний підпис"}

Перезайдя в кабинет я уже вижу другое значение в поле password. Значит «Authorization» хедер может иметь несколько вариаций, и эта нам не подходит...

Похоже всё это непотребство с подписями происходит через либу EUSignCP, у привата даже есть микро пример: acsk.privatbank.ua/...​11113-290920-0908-295.pdf и неработающая ссылка на их гит =)

Ну ЧиТД: шаманство с очечественной ГосСовБытСоюзТрестКриптографией Цвиркунчык-Пострыбунчык™.

ну то візміть на гітхабі опенсорцну дсту-кріптографію, там не складно

Ну и налоги:

curl -s 'https://cabinet.tax.gov.ua/ws/api/ta/splatp/page?year=2021&cSti=&page=0'  -X GET \
    -H 'Content-Type: application/json' \
    -H 'Authorization: '"$TOKEN" \
    -H 'Accept: application/json'|jq '.content|map(.namePlt,.narahEnd,.splbdEnd,.pereplEnd)'
Не все из этих чисел даже в Кабинете отображаются, хехе.

Підписатись на коментарі