Стратегія аутентифікації мікросервісу


138

Мені важко вибирати гідну / безпечну стратегію аутентифікації для архітектури мікросервісу. Єдине повідомлення про те, що я знайшов у цій темі, це: Єдиний вхід у архітектуру мікросервісів

Моя ідея тут полягає у тому, щоб у кожній службі (наприклад, аутентифікація, обмін повідомленнями, повідомлення, профіль тощо) мати унікальну посилання на кожного користувача (цілком логічно, ніж його user_id) та можливість отримати поточного користувача, idякщо він увійшов.

З моїх досліджень я бачу дві можливі стратегії:

1. Спільна архітектура

Спільна архітектура

У цій стратегії додаток для аутентифікації є однією з інших послуг. Але кожен сервіс повинен бути в змозі зробити перетворення session_id=> user_idтому він повинен бути мертвим простим. Ось чому я подумав про Redis, який би зберігав ключ: value session_id:user_id.

2. Архітектура брандмауера

Архітектура брандмауера

У цій стратегії зберігання сеансу насправді не має значення, оскільки ним керує лише програма аутентифікації. Тоді user_idбалон можна переадресувати на інші служби. Я подумав про Rails + Devise (+ Redis або mem-cached, або зберігання файлів cookie тощо), але є багато можливостей. Важливо лише те, що Service X ніколи не потребуватиме автентифікацію користувача.


Як порівняти ці два рішення щодо:

  • безпека
  • стійкість
  • масштабованість
  • простота використання

А може, ви запропонуєте інше рішення, про яке я тут не згадував?

Мені подобається рішення №1 краще, але я не знайшов особливої ​​реалізації за замовчуванням, який би забезпечив мене тим, що я йду в правильному напрямку.

Я сподіваюся, що моє питання не закриється. Я не знаю, де ще це запитати.

Спасибі заздалегідь


1
Чи не хотіли б ви вказати більше деталей щодо того, що ви намагаєтесь досягти? У першому випадку чи відбувається автентифікація щодо Redis, або в самих службах? Redis відсутній у другій схемі, це навмисно?
— Пламен Петров

Я додав деяку інформацію. Будь ласка, дайте мені знати, що це все ще незрозуміло. Дякую!
— Августин Рідінгер

Чи замислювалися ви над ідеєю створити мікросервіс, який використовує протокол OAuth та службу вашого іншого, використовує створений Token?
— Тіаре Бальбі

Мені цікаво це рішення, але я досі не розумію, як це буде працювати на практиці. Чи знаєте ви, де я міг би знайти деякі стандартні його реалізації?
— Августин Рідінгер

@AugustinRiedinger, дякую за це Я також розбиваю свою монолітну веб-програму на мікросервіси, роблячи кроки дитини. У вашому випадку, чи є Служби 1-n без громадянства або штатні. Якщо ви повноцінні, чи задумалися ви про управління сеансами в кожній із цих служб. Спасибі
— Манчанда. П

Відповіді:


61

Виходячи з того, що я розумію, хороший спосіб вирішити це за допомогою протоколу OAuth 2 (ви можете знайти трохи більше інформації про це на http://oauth.net/2/ )

Коли ваш користувач увійде у вашу програму, він отримає маркер, і за допомогою цього маркера вони зможуть надіслати інші служби, щоб ідентифікувати їх у запиті.

Модель OAuth 2

Приклад дизайну ланцюга мікросервісу Модель архітектури

Ресурси:


1
Спасибі це досить зрозуміло. Мені здалося, що
— Августин Рідінгер,

16
Ваша відповідь чудова, але як жетоном, створеним з шлюзу API (зсередини нього або з AuthMicroService), може оброблятись випадкова мікросервіс, метою якого є не автентифікація, і, ймовірно, не керуйте аутентифікацією всередині його діловий код?
— mfrachet

Наприклад, ви можете використовувати Netflix Zuul для надсилання маркера, отриманого в шлюзі, до всіх служб, і вони дізнаються інформацію про користувачів. docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…
— Tiarê Balbi

Ще одна приємна річ у використанні OAuth2 між сервісами - це те, що у вас можуть бути кінцеві точки, які розрізняють дії з аутентифікацією сервісу та аутентифікацією користувача
— cmp

2
OAuth більше стосується надання доступу до даних користувачів, що зберігаються в іншій системі. Це для мене схоже на хороший випадок для SAML.
— Роб Грант

8

Коротка відповідь: Використовуйте аутентифікацію на основі лексеми Oauth2.0, яку можна використовувати в будь-якому типі додатків, таких як веб-версія або мобільний додаток. Потім послідовність кроків для веб-програми буде виконана

  1. аутентифікуватися проти постачальника ідентифікаторів
  2. зберігати маркер доступу у файлі cookie
  3. доступ до сторінок у веб-сайті
  4. зателефонуйте до служб

На схемі нижче зображені компоненти, які були б необхідні. Така архітектура, що розділяє Інтернет та apis даних, дасть хорошу масштабованість, стійкість та стабільність

введіть тут опис зображення


Хіба AWS Lambda не стає «холодною» і потрібен час для запуску? Це зробило б вхід повільним, чи не так?
— tsuz

@tsuz, AWS тепер запровадив функцію паралельності в лямбдах, де ви можете резервувати сумісність. За допомогою цього ви могли б виправити проблему з холодним стартом. docs.aws.amazon.com/lambda/latest/dg/…
— Sandeep Nair

Мені б хотілося бачити цю відповідь років тому, і це неймовірно просто зрозуміти, як архітектуру мікросервісів з аутентифікацією та авторизацією незалежних мікросервісів можна упорядкувати, щоб отримати доступ до інших сервісів
— brayancastrop

@Sandeep, я думаю, ви маєте на увазі Забезпечену одночасність і не зарезервовано.
— Аніл Кумар

0

Для його реалізації слід використовувати схему шлюзу API, використовуючи OpenID Connect. Користувач отримає автентифікацію IDP та отримає маркер JWT від сервера авторизації. Тепер система шлюзу API може зберігати цей маркер у базі даних Redis та встановлювати файли cookie у браузері. Шлюз API використовуватиме файли cookie для підтвердження запиту користувача та надсилатиме маркер до мікросервісів.

Шлюз API є єдиною точкою входу для всіх типів клієнтських додатків, таких як загальнодоступний клієнтський сценарій Java, традиційний веб-додаток, нативний мобільний додаток та сторонні клієнтські програми в архітектурі мікросервісу.

Більш детальну інформацію про нього можна знайти на http://proficientblog.com/microservices-security/


-2

ви можете використовувати сервер idenitty 4 для автентифікації та авторизації

ви повинні використовувати архітектуру брандмауера, отже, ви маєте більше контролю над безпекою, надійністю, масштабованістю та простотою використання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.