Uwierzytelnianie i autoryzacja kilku webapi w jednym api

0

Mam 3 aplikacje WebAPI w netcore. Chcialbym teraz napisac aplikacje webapi ktora będzie udostepniac uwierzytelnianie i autoryzacje dla pozostałych trzech aplikacji. Czy takie coś jest w ogóle możliwe. Proszę o jakieś sugestie jak to zrobić

0

Jest możliwe i można to zrobić na wiele sposobów ale musisz napisać coś więcej. Co to są z autoryzacje czy to tych pozostałych APi też masz dostęp jako programista? Generalnie najwięcej jak się da.

Zakładając. że wszystkie te Api są "Twoje" to najłatwiej (nie najlepiej) aby to "czwarte API autoryzujące" po zalogowaniu generowało jakiś token a następnie wysłało do klienta i zapisało lokalnie w jakimś cache/bazie/redis/pliku. Następnie do pozostałych trzech api zamiast danych logowania przesyłasz właśnie ten token. Pozostałe 3 Api po otrzymaniu takiego tokena odpytują się "4 api autoryzujące" o szczegóły użytkownika, czasu logowania itp .. itd.. ( w zależności co im tam jest potrzebne ) Taki token najlepiej jak będzie jednorazowy lub o bardzo krótkim czasie ważności.

Szczegóły jednak zależą od tego jak te wszystkie API działają ... Ogólnie autoryzacje to w chuuuuuuuuuu .... wielki temat.
To co opisałem to taka najprostsza w miarę sensowna autoryzacja w której między klientem a "pozostałymi" API nie trzeba przesyłać danych autoryzacyjnych tych pozostałych api redukując prawdopodobieństwo ich przechwycenia. Samo przechwycenie tokena ( jeśli będzie jednorazowy ) też nie daje potencjalnemu "napastnikowi" szerokiego pola manewru.

0

Można, tylko trzeba odpowiednio skonfigurować te dwie pozostale aby uderzaly z tokenem do servera autoryzującego. Może spróbuj skorzystać z http://docs.identityserver.io/en/aspnetcore2/index.html

1

Inny wariant tego co napisał @katakrowa ale bez odpytywania

Zawsze możesz też użyć JWT i mieć jeden secret key znany przez każde API i tylko jeden endpoint w jednym API który generuje token i normalnie odpytując te inne API podsyłasz w headerze tego JWT, a one będą go validować poprawnie, bo secret się zgadza.

Nie wiem na ile to jest bezpieczne, ale będzie działać :> @Shalom thoughts?

0
katakrowa napisał(a):

Jest możliwe i można to zrobić na wiele sposobów ale musisz napisać coś więcej. Co to są z autoryzacje czy to tych pozostałych APi też masz dostęp jako programista? Generalnie najwięcej jak się da.

Mam dostęp do kodu i mogę go modyfikować we wszystkich API. Chce żeby to nowe API odpowiadalo za uzytkownikow. Tylko to API powinno miec dostep do bazy z uzytkownikami i danymi o ich uprawnieniach.Pozostałe api powinny sprawdzac czy uzytkownik jest zalogowany oraz czy ma uprawnienie do wywołania danej akcji (tutaj chyba beda potrzebne jakies role uzytkownikow).

katakrowa napisał(a):

Zakładając. że wszystkie te Api są "Twoje" to najłatwiej (nie najlepiej) aby to "czwarte API autoryzujące" po zalogowaniu generowało jakiś token a następnie wysłało do klienta i zapisało lokalnie w jakimś cache/bazie/redis/pliku. Następnie do pozostałych trzech api zamiast danych logowania przesyłasz właśnie ten token. Pozostałe 3 Api po otrzymaniu takiego tokena odpytują się "4 api autoryzujące" o szczegóły użytkownika, czasu logowania itp .. itd.. ( w zależności co im tam jest potrzebne ) Taki token najlepiej jak będzie jednorazowy lub o bardzo krótkim czasie ważności.

No tak, ale API1,API2,API3 tez powinny sie jakos uwierzytelnic w API4?
Token ma miec krótki czas waznosci, a co w przypadku jak wygasnie, trzeba od nowa sie zalogowac?

WeiXiao napisał(a):

Zawsze możesz też użyć JWT i mieć jeden secret key znany przez każde API i tylko jeden endpoint w jednym API który generuje token i normalnie odpytując te inne API podsyłasz w headerze tego JWT, a one będą go validować poprawnie, bo secret się zgadza.

Chyba tak zrobię. Zastanawiam sie tylko jak to moze wygladac. User loguje się przez API uwierzytelniajace. Jezeli login i haslo sa poprawne to w odpowiedzi dostaje token. Jak juz ma token to odpytuje sobie juz API 1,2,3 o potrzebne dane i z kazdym requestem wysyla tez ten token. Tutaj wystarczy zeby API1, API2 i API3 miało zaimplementowany mechanizm walidacji tokena i wszystko powinno działać? Zastanawiam sie tylko nad autoryzacja bo zeby autoryzowac usera w kazdym API to w tokenie musze miec tez role czy tam uprawnienia pobrane z bazy uzytkownikow. Co jesli bede mial takich rol/uprawnien 1000 i w dodatku moga sie one często zmieniać?

0

Mam dostęp do kodu i mogę go modyfikować we wszystkich API. Chce żeby to nowe API odpowiadalo za uzytkownikow. Tylko to API powinno miec dostep do bazy z uzytkownikami i danymi o ich uprawnieniach.Pozostałe api powinny sprawdzac czy uzytkownik jest zalogowany oraz czy ma uprawnienie do wywołania danej akcji (tutaj chyba beda potrzebne jakies role uzytkownikow).

Niekoniecznie ale to zależy co to za API jeśli każde ma swoją bazę użutkowników i uprawnień to pewnie dostęp do bazy już będzie wymagany. Ale tylko do autoryzacji. Odpytywanie o uprawnienia może pozostać w api "docelowym".

No tak, ale API1,API2,API3 tez powinny sie jakos uwierzytelnic w API4?
Token ma miec krótki czas waznosci, a co w przypadku jak wygasnie, trzeba od nowa sie zalogowac?

To także zależy od tego jak korzystasz z tych API. Przecież ważność tokena może być ograniczona np. trwaniem sesji pomiędzy klientem a API autoryzacyjnym. Ryzyko takie że jak ktoś w czasie trwania sesji przechwyci token to też będzie miał dostęp.

0

Użyj IdentityServer jak człowiek a nie wymyślaj koło na nowo

0
katakrowa napisał(a):

Niekoniecznie ale to zależy co to za API jeśli każde ma swoją bazę użutkowników i uprawnień to pewnie dostęp do bazy już będzie wymagany. Ale tylko do autoryzacji. Odpytywanie o uprawnienia może pozostać w api "docelowym".

Bazę uzytkownikow i uprawnien do kazdej z aplikacji chcialbym miec jedna.

katakrowa napisał(a):

To także zależy od tego jak korzystasz z tych API. Przecież ważność tokena może być ograniczona np. trwaniem sesji pomiędzy klientem a API autoryzacyjnym. Ryzyko takie że jak ktoś w czasie trwania sesji przechwyci token to też będzie miał dostęp.

Czyli co jakis klient musialby sie od nowa zalogowac zeby dostac nowy token?

0

Czyli co jakis klient musialby sie od nowa zalogowac zeby dostac nowy token?

Możesz wygenerować refreshToken i odświeżać za jego pomocą accessToken. IdentityServer ma zaimplementowany ten workflow http://docs.identityserver.io/en/3.1.0/topics/refresh_tokens.html.

1 użytkowników online, w tym zalogowanych: 0, gości: 1