Ми намагаємося визначити найкращий спосіб авторизувати користувачів в архітектурі мікросервісу, забезпечуючи при цьому мікросервіси обмеженими дозволами. Наша архітектура використовує центральну службу авторизації для обробки видачі JWT жетонів.
У нас є такі вимоги:
Користувачів слід обмежувати виконувати певні ролі. наприклад, користувач повинен мати можливість створювати / змінювати / читати вміст, який йому належить.
Мікросервіси повинні бути обмежені лише необхідними дозволами. наприклад, мікросервіс, який потребує лише зчитування даних з іншої служби, повинен бути явно заборонений у записі даних до цієї служби.
Наприклад, припустимо, що у нас є система, де користувачі можуть завантажувати зображення в сервіс зберігання зображень. У нас є служба розмітки тегів, яка автоматично позначає зображення на місці розташування. Користувачі можуть лише CRUD власні фотографії. Служба розмітки тегів може читати будь-яке зображення у службі зберігання зображень, однак не має змоги змінювати / видаляти.
Який хороший спосіб досягти вищезазначеного за допомогою жетонів JWT? Деякі рішення, про які ми говорили:
Служба зберігання зображень відкриває 2 API, один, який доступний зовні (надання користувачеві CRUD доступу) та той, який доступний всередині (надання внутрішнього доступу лише для читання). Здається негнучким - що робити, якщо інша внутрішня служба потребує доступу до читання / запису до всіх зображень (наприклад, до того, що автоматично видаляє явні зображення)?
Ми встановили два права доступу в JWT користувача, один - CRUD_OwnImages, а другий - READ_ForAnalysis. Служба розмітки тегів може побачити, чи має користувач READ_ForAnalysis дозволів, і якщо так, подайте відповідний запит. У нас є ще одна мікросервіс, який перевіряє, чи є у користувача CRUD_OwnImages для операцій CRUD на власних зображеннях користувача. Це покладає на кожну мікросервіс відповідальність за те, щоб користувач обмежився необхідними йому діями. У магазині зображень немає способу обмежити кожен мікросервіс таким підходом, тому він потенційно може лускатись і схильний до помилок.
Ми надаємо мітковій мітці власний користувач, з дозволом READ_ForAnalysis. Потім, коли служба тегування запитує зображення з магазину зображень, їй надається доступ до них, але забороняється змінювати їх. Користувач користувача має лише дозвіл CRUD_OwnImages, тому він може отримати та отримати доступ лише до своїх зображень із фронта. Якщо інша служба потребує CRUD для всіх даних, ми можемо надати її CRUD_AllData або подібні. Нам подобається такий підхід, оскільки кожна служба зараз відповідає за власні дані (а не за те, що логіка дублюється в декількох службах), але що робити, якщо для служби потрібні як користувацькі, так і дозволи мікросервісу? Чи можемо ми надійно надсилати два маркери JWT (як користувача, так і мікросервісу)? Чи існує спосіб безпечно поєднати дозволи та надіслати їх? напр
Проблема посилюється, якщо інформація користувача потрібна далі за течією (2 або 3 мікросервіси). Чи ми просто припускаємо, що окремі мікросервіси повинні обмежуватись необхідними їм діями, а не робити це явним?