Mam od pewnego czasu przemyślenia odnośnie zabezpieczenia połączenia API to API.
Założenia są takie, że obydwie aplikacje są hostowane w chmurze, u mnie jest to Azure, i w tym kontekście będę się trzymał, ale podejście w każdej będzie podobne.
Jakie znam sposoby zabezpieczenia:
-
client id & secret: dość popularne połączenie, ale tego jeszcze nie implementowałem, ale widziałbym tutaj wykorzystanie KeyVault gdzie trzymamy clientSecret, natomiast gdzieś w bazie trzymamy nazwę klucza, którą wyciągniemy za pomocą clientId i sprawdzimy wartości
-
token JWT generowany w kontekście aplikacji: to ostatni raz implementowałem kilka lat temu (jeszcze z wykorzystaniem IdentityServer), do poprawnego działania należy dodać access w APP registration w danym API
-
token JWT od usera: z tym się też bardzo często spotykam, wykorzystujemy token z
bierzącegobieŻącego requestu, do komunikacji z innym API, tutaj też jest wymagana odpowiednia konfiguracja w app registration -
one-time token: jest to metoda bazująca na nieodwracalnym szyfrowaniu, tak aby nie dało się podejrzeć co jest źródłem, taki token można wykorzystać przez określąną ilość razy, zazwyczaj jest to 1, w skrócie jak to działa, na podstawie modelu jaki wysyłamy tworzymy taki token z wykorzystaniem szyfrowania Base, do takiego modelu dodaje się jeszcze jakiś time-stamp, no i oczywiście zanim wrzucimy do Base można to jeszcze jakoś zaszyfrować z użyciem salt, tak nawet przy wyłapaniu takiego requestu i po zmianie modelu autoryzacja się nie uda, no i tutaj wymagane jest aby API miało ten sam algorytm do generowania takiego tokenu
Ja chciałem iść w najprostsze rozwiązanie - client id & secret. Usłyszałem, że to można podsłuchać i lepiej wykorzystać token generowany w kontekście API
no ale taki token też można podsłuchać, jedynie ma krótszą żywotność od client id & secret
Pomijając problem podsłuchu w usługach chmurowych
Jak Wy zabezpieczacie takie połączenia?