Cześć Wszystkim,
Na pytanie z tematu wątku (myślę) znam odpowiedź, jeden serwis może być OAuth2 Clientem i Resource Serverem. Pytanie czy jest to poprawne podejście.
Trochę kontekstu.
Robię 4fun projekt template, który posłuży jako szybki bootstrap do budowy aplikacji webowych opartych na React i Spring Boot. W założenia wpisałem sobie, że taki template to prosty UI z formularzami do logowania/rejestracji za pomocą kredek jak i zewnętrznych IDP, oraz zabezpieczenie routeów po stronie frontu i endpointów po stronie backendu.
Teraz problem, który chce rozwiązać i jak sobie to wyobrażam.
Na początku stwierdziłem, że mój pojedynczy serwer będzie zarówno klientem jak i resource serverem. Nawet zacząłem iść w tym kierunku, widziałbym to tak, że na froncie pod przyciskiem logowania za pomocą zewnętrznego IDP np. Google kryje się zwykły link do backendu z konkretną końcówką. Użytkownik jest przekierowany do zewnętrznego IDP i wraca z informacją czy uwierzytelnienie się powiodło. W Spring Security przechodzimy do Success Handlera, który mi wygeneruje JWT w claimsach umieszczam token, z którym użytkownik wrócił od zewnętrznego dostawcy. Użytkownik wraca skąd przyszedł i zapisuje się JWT. Potem przy każdym strzale na backend JWT jest walidowany, myślałem, też żeby odpytać ext IDP o poprawność tokenu, z którym wrócił użytkownik, i którego zapisaliśmy w claimsach (overkill?).
Plus, minus takbym widział high-level flow.
Jednak coraz bardziej mam przekonanie, że klientem OAuth2 powinien być front, a backend jako resource server potwierdzać poprawność tokenu, z którym przychodzi użytkownik. W tym podejściu backend nie musi być dostępny dla świata, np. mogę mieć dwa kontenery, które są w jednej sieci wirtualnej ale tylko front jest wystawiony na zewnątrz. W pierwszym podejściu backend musiałby być dostępny dla świata, aby móc przekierować usera z poziomu backendu do zewnętrznego dostawcy tożsamości.
Stąd też następujące pytania:
- Jakie podejście jest lepsze i dlaczego? Jeżeli odpowiedzią jest "To zależy", to od czego zależy?
- Jeżeli Client i Resource Server na backendzie to jak zarządzać JWT? Czytałem, że token, który wydaje zewnętrzny IDP nie powinien być używany po stronie backendu, stąd też pomysł żeby generować nowy JWT a w claimsach zawrzeć ten od IDP w celu podwójnej walidacji.
- Jeżeli Client i Resource Server na backendzie to czy przedstawione flow jest w porządku? Może ktoś zna jakieś przykładowe repo.
- Jeżeli Client na Frontendzie, to czy są rzeczy, na które trzeba zwrócić uwagę z powodu, że tutaj jest to publiczny klient, który nie przechowuje żadnych secretów.
Link do repo: https://github.com/malochak/react-spring-tailwind-auth