2016-07-09 50 views
6

Piszę aplikację zabawkową do ćwiczenia mikroserwisów i uwierzytelniania na nodejs (expressjs).Architektura uwierzytelniania mikroserwisów z passport.js

Mam klienta reakcji, usługę uwierzytelniania i inne usługi (po prostu odpowiadają "Cześć" do tej pory).

  • Klient będzie hostowany w CDN.
  • Usługa autoryzacji nasłuchuje na porcie 5000 (na przykład)
  • Pozostałe usługi nasłuchują na porcie 6000-6100.
  • Mam db do przechowywania informacji o sesji (oauth token dostarczany przez twitter).
  • Mondzieb, w którym przechowywane są informacje o aplikacji (nie dotyczy tego pytania).

Chodzi o to, że nieuwierzytelniony klient przechodzi do usługi uwierzytelniania, klikając przycisk Twitter (SSO). Następnie usługa auth uzyskuje wygenerowany token przysięgi twitter i ustawia ten token w magazynie redis. Następnie token jest dostępny dla pozostałych usług, dzięki czemu wie, czy żądanie zostało uwierzytelnione, czy też nie, sprawdzając, czy już istnieje w magazynie redis (jeśli użytkownik usunie swoje konto, zostanie również usunięte z magazynu redis) . Po uwierzytelnieniu przesyłaję token twittera z klienta na serwer.

enter image description here

Uważam to podejście dość proste (inni używają proxy Nginx do uwierzytelniania, ale nie widzę powodu, dla, że ​​z wyjątkiem, jeżeli usługi te są przechowywane w różnych dziedzinach, ale nie rozumiem, to bardzo dobrze) więc obawiam się, że brakuje mi czegoś na temat bezpieczeństwa, na przykład.

Pytania:

  1. Czy to podejście prawidłowe?
  2. Czy bezpieczne jest udostępnianie tokena Twittera (tak mi się wydaje)?
  3. Czy jest jakiś problem z bezpieczeństwem, którego tu nie dostrzegam?

Odpowiedz

1

Stosując to podejście, trzeba będzie zweryfikować token we wszystkich usługach, jeśli wszystko jest w porządku, prawdopodobnie wszystko w porządku.

twitter token dostępu może mieć upływa czas, które uczynią to niezbędne do korzystania z tokena odświeżania, aby otrzymać nowy żeton dostępu z usługi logowania:

  • Kiedy token dostępu wygasa byś zwrócić 401 do klienta, z usługi X, z którą próbujesz rozmawiać.
  • Klient musiałby zadzwonić usługa Auth zapewniając odświeżania żeton, uzyskanie nowego token dostępu
    • Finaly klient będzie ponownie uderzając Service X z tego nowego tokenu dostępu, mają to zatwierdzone i uzyskać oczekiwany odpowiedź z Service X.

W moim recent assignment pisałem mikro-usługę proxy wszystkie żetony, stosując takie podejście moje proxy obsługiwane wszystko od auth do ról i wysyłanie 401 dla wygasłych tokenów i cofania tokeny odświeżania itp myślę, że to dał mi większy rozdział obaw.

Ważna uwaga: W scenariuszu tokena odświeżania powyżej mojego pełnomocnika tylko doświadczy obciążenie dla niepoprawną/wydychanym accesstoken, podczas gdy w scenariuszu każda usługa może być osiągnięty z nieprawidłowych żetonów ...

Innym podejściem byłoby należy pozwolić, aby Service-A i Service-B wywoływały usługę uwierzytelniania w celu sprawdzania poprawności tokenów, ale to by wnioskowało o wiele więcej ruchu między usługami, ponieważ każde żądanie HTTP z tokenem musi zostać sprawdzone. Również w tym scenariuszu nieprawidłowe żądanie tokenu dotrze do Twojej usługi X, a tym samym wnioskuje o obciążeniu ...