Застарілий спосіб авторизації: Користувач мав змогу авторизуватись в аукціоні по прямому URL-посиланню з можливістю ввести його в адресний рядок браузеру, де вказані його персональні авторизаційні дані. Наприклад:

https://auction.prozorro.sale/ХХХХХ-UA-ХХХХХХХХХХХ?bidder_id=ХХХХХХХХХХ&acc_token=ХХХХХХХХХХ

Де:
-  ХХХХХ-UA-ХХХХХХХХХХХ - auction_id - людиночитаємий ідентифікатор аукціону, в якому бере участь користувач;
bidder_id - унікальний Ідентифікатор учасника, який він отримує в API після того як його закрита цінова пропозиція активована;
acc_token - авторизаційний токен, який надає йому змогу користувачу авторизуватись в аукціону як Учасник та робити ставки.


Єдиний інтерфейс - це інструмент, за допомогою якого майданчики мали змогу створювати власний інтерфейс аукціону з відображенням інформації по ньому та робити ставки, не використовуючи внутрішній модуль аукціонів. Його відмінністю було те, що Єдиний Інтерфейс надавав змогу відображати інформацію одразу по декільком аукціонам, в яких на протязі 24 годин брав участь конкретний користувач, за допомогою створення спеціальних рум (room), де він міг робити ставки одночасно в декільках аукціонах. Руми використовувались для відображення приватної інформації з правами бідера. Сервер майданчика формує рум та дозволяє робити ставки, а браузер клієнта в свою чергу звертається до фіда (далі - feed).

Цільовим призначенням даного інтерфейсу було його використання в процедурах деревини (TIE), де він слугував обов’язковою вимогою для майданчиків по даному напрямку (на разі, дану вимогу скасовано).
Додатково даний функціонал міг надавати майданчикам (за їх власним бажанням) функціональну перевагу в проходженні торгів учасників - за допомогою створення ботів, що мали змогу самостійно робити ставки замість учасників. Та інші додаткові сервіси для клієнтів.
Візуальний приклад реалізації Єдиного Інтерфейсу майданчиком:

https://drive.google.com/file/d/16Muips6syexWIJdZx2qDkPsvLg2-_MgA/view?usp=sharing
Відео з демо роботи єдиного інтерфейсу на одному з майданчиків:
https://drive.google.com/file/d/1-KGSI5yyioW121GWyj9ExMdfwy34kedr/view?usp=sharing

Ендпойти Єдиного інтерфейсу, які вилучені з системи:

1. [POST]  /api/auctions/room - Створення руму:

  • Дозволяє створити “кімнату” для учасника, який одночасно бере участь в декількох аукціонах.
  • В тілі запиту даного ендпойнту вказується перелік аукціонів, в яких бере участь користувач, з їх параметрами: auction_id, bidder_id та acc_token. 
  • Кожен з аукціонів вказується у вигляді окремого об’єкту, кількість яких необмежена.
  • Після створення руму йому присвоюється окремий ідентифікатор - “room_id” зі значенням, до прикладу “cb8d206af0f9467ebd59993fe4c752af”, що отримується в респонсі даного ендпойтну.  Зі статусом 201 Room created.
  • Рум створюється в день аукціонів на один день (24 години).
  • Реалізація була такою, що додавати аукціони вже в створений рум не було можливості, так як в анлійських аукціонах день в день подавати заявки на участь учасники не можуть, та  всі аукціони стартують одночасно.

Приклад запиту даного ендпойнту:
{

  "TE001-UA-20191104-54321": {

    "bidder_id": "a1f44e85-96ec-4898-9c42-86cb42f5beb1",

    "acc_token": "51c13c45-fb24-46c2-a3ac-adf64c05d791",

    "tz": "UTC"

  },

  "TE001-UA-20191104-12345": {

    "bidder_id": "a1f44e85-96ec-4898-9c42-86cb42f5beb1",

    "acc_token": "51c55c45-fb24-46c2-a3ac-adf64c05d792"

  }

}

  1. [GET] /api/auctions/rooms/{room_id}/feed - Підключення до руму (кімнати):
  • Надає можливість підключення до вебсокету, який для створеної кімнати віддає поточний стан для множини аукціонів у випадку їх зміни.
  • Стани аукціону, зміни по яким надає можливість отримувати даний ендпойнт: власні ставки,ставки інших учасників, зміна раунду, час початку/завершення ходу учасника, та інше. А після завершення аукціону - також деанонімізація учасників аукціону з їх ставками.
  • Частота оновлень інформації в вебсокеті: сокет при підключенні до нього віддає актуальний стан всіх аукціонів. Після чого він надає автоматично оновлення лише в момент фактичного оновлення інформації по будь якому з об’єктів в базі даних.
  • До прикладу, якщо в румі з трьох аукціонів оновилась інформація по будь якому 1-му з них, то оновлюється інформація одразу по 3-х аукціонах.
  • Даний ендпойнт дає змогу лише читати (readonly) інформацію по аукціонах, та не вносити зміни по ним.
  • Фактично ендпойнт повторює інформацію, що можна отримати з JSON по кожному аукціону.
    Приклад: wss://auction-staging.prozorro.sale/api/auctions/rooms/0057e70c7d8347debf1cb06c45cb15bd/feed
    Інструмент для перегляду: https://websocketking.com/


  1. [GET] /api/{auction_id}/feed - Підключення до одного об’єкту аукціону:
  • Даний ендпойт повторює логіку попереднього /api/auctions/rooms/{room_id}/feed з відмінністю, що надає інформацію лише по одному об’єкту аукціону, а не їх масиву
  • Може використовуватись для створення майданчиком інтерфейсу аукціону, по аналогії модулю аукціону.
  • Не дає можливості змінювати стани аукціону
  • Також відмінністю від румів є те, що частота оновлень в ньому відбувалась раз в одну секунду, та не залежала від фактичних змін об’єкту аукціону.


  1. [POST] /api/auctions/{auction_id}/bid - Подача ставки:
  • За допомогою даного ендпойнту Учасник міг змінювати власну ставку в аукціоні, як в рамках румів, так і одинарного об’єкту аукціону.
  • Можливість змінювати ставку обмежена виключно під час власної черги Учасника. 
  • У випадку спроби подачі ставки в інший проміжок часу - відображалась помилка 400 - Bad request, cannot post bid in current state
  • Якщо вказані не вірні авторизаційні дані учасника - 403 Permission error
  • Якщо не вірно auction_id - 404 Auction not found
  • Приклад тіла запиту ендпойту:

{

  "bid": 3000.01

}

  1. POST] /api/auctions/{auction_id}/bid/cancel - Відміна ставки:
  • Аналогічно попередньому ендпойнту - Учасник міг відміняти останні зміни своєї ставки під час конкретного раунду та власної черги.
  • Відміна ставки заборонялась у час, відмінний віл власної черги.
  • У випадку успішної зміни - 200 Bid was cancelled
  • У випадку спроби зміни ставки в інший час - 400 Bad request, cannot cancel bid in current state
  • Саме два останні ендпойнти давали можливість взаємодіяти Користувачу з аукціоном та впливати на його стан.




Причини відмови від застарілої авторизації та ендпойнтів Єдиного інтерфейсу:

  • Безпека: це створювало не захищене з’єднання, що могло служити витіком приватної інформації, скомпрометувати торги, заволодіти даними учасника, діяти від його імені та ін.
  • Навантаження: руми перенавантажували систему та ресурси.Якщо відкривати в нових вкладках браузера, кожна рахується як окрема операція.


Альтернативний спосіб взаємодії з аукціоном без залучення діючого інтерфейсу модулю аукціонів:

  • Якщо майданчик програмно перейде за допомогою посилання оновленої авторизації через auth сервер (https://procedure.prozorro.sale/api/auth/auction?token=...)

  • То зможе отримати cookies даних користувача

За допомогою останніх є можливість реалізувати власне підключення до аукціону та взаємодіяти з ним

  • No labels