Trudno mi wybrać przyzwoitą / bezpieczną strategię uwierzytelniania dla architektury mikrousług. Jedyny post SO, jaki znalazłem na ten temat, to ten: Single Sign-On in Microservice Architecture
Moim pomysłem jest posiadanie w każdej usłudze (np. Uwierzytelnianie, przesyłanie wiadomości, powiadomienie, profil itp.) Unikalnego odniesienia do każdego użytkownika (całkiem logicznie niż jego user_id
) i możliwość uzyskania aktualnego użytkownika, id
jeśli jest zalogowany.
Z moich badań wynika, że istnieją dwie możliwe strategie:
1. Architektura współdzielona
W tej strategii aplikacja uwierzytelniająca jest jedną z usług. Ale każda usługa musi mieć możliwość wykonania konwersji session_id
=>, user_id
więc musi być śmiertelnie prosta. Dlatego pomyślałem o Redisie, który przechowywałby klucz: wartość session_id:user_id
.
2. Architektura zapory
W tej strategii przechowywanie sesji nie ma tak naprawdę znaczenia, ponieważ jest obsługiwane tylko przez aplikację uwierzytelniającą. Następnie user_id
można je przekazać do innych usług. Pomyślałem o Rails + Devise (+ Redis lub pamięć podręczna lub przechowywanie plików cookie itp.), Ale jest mnóstwo możliwości. Liczy się tylko to, że Service X nigdy nie będzie musiał uwierzytelniać użytkownika.
Jak wypada porównanie tych dwóch rozwiązań pod względem:
- bezpieczeństwo
- krzepkość
- skalowalność
- łatwość użycia
A może zasugerowałbyś inne rozwiązanie, o którym tutaj nie wspomniałem?
Rozwiązanie nr 1 podoba mi się bardziej, ale nie znalazłem zbyt wielu domyślnych implementacji, które zabezpieczyłyby mnie w tym, że idę w dobrym kierunku.
Mam nadzieję, że moje pytanie nie zostanie zamknięte. Naprawdę nie wiem, gdzie jeszcze o to zapytać.
Z góry dziękuję
źródło
Odpowiedzi:
W oparciu o to, co rozumiem, dobrym sposobem rozwiązania tego problemu jest użycie protokołu OAuth 2 (więcej informacji na jego temat można znaleźć na stronie http://oauth.net/2/ )
Gdy Twój użytkownik zaloguje się do Twojej aplikacji, otrzyma token i za jego pomocą będzie mógł wysłać do innych usług, aby zidentyfikować go w żądaniu.
Przykład Chained Microservice Design
Zasoby:
źródło
Krótka odpowiedź: użyj uwierzytelniania opartego na tokenach typu Oauth2.0, którego można używać w aplikacjach dowolnego typu, takich jak aplikacja internetowa lub aplikacja mobilna. Następnie następowałaby sekwencja czynności wykonywanych przez aplikację internetową
Schemat poniżej przedstawia potrzebne komponenty. Taka architektura oddzielająca sieć i interfejs API danych zapewni dobrą skalowalność, odporność i stabilność
źródło
Do implementacji tego przy użyciu OpenID Connect należy użyć wzorca bramy API. Użytkownik zostanie uwierzytelniony przez IDP i otrzyma token JWT z serwera autoryzacyjnego. Teraz system bramy API może przechowywać ten token w bazie danych Redis i ustawić plik cookie w przeglądarce. Brama API użyje pliku cookie do zweryfikowania żądania użytkownika i wyśle token do mikrousług.
Brama API działa jako pojedynczy punkt wejścia dla wszystkich typów aplikacji klienckich, takich jak publiczna aplikacja kliencka skryptów java, tradycyjna aplikacja internetowa, natywna aplikacja mobilna i aplikacje klienckie innych firm w architekturze Microservice.
Więcej informacji na ten temat można znaleźć na http://proficientblog.com/microservices-security/
źródło
możesz użyć idenitty server 4 do celów uwierzytelniania i autoryzacji
musisz używać architektury Firewall, dzięki czemu masz większą kontrolę nad bezpieczeństwem, solidnością, skalowalnością i łatwością użytkowania
źródło