Projektuję usługę internetową zgodną z REST, do której muszą mieć dostęp użytkownicy, ale także inne usługi i aplikacje internetowe. Wszystkie przychodzące żądania muszą zostać uwierzytelnione. Cała komunikacja odbywa się za pośrednictwem protokołu HTTPS. Uwierzytelnianie użytkownika będzie działało w oparciu o token uwierzytelniający, uzyskany poprzez POST przesłanie nazwy użytkownika i hasła (przez połączenie SSL) do zasobu / session udostępnianego przez usługę.
W przypadku klientów usług internetowych za usługą klienta nie stoi żaden użytkownik końcowy . Żądania są inicjowane przez zaplanowane zadania, zdarzenia lub inne operacje komputerowe. Lista usług łączących jest znana z góry (oczywiście, tak mi się wydaje). Jak mam uwierzytelnić te żądania pochodzące z innych usług (internetowych)? Chcę, aby proces uwierzytelniania był jak najłatwiejszy do wdrożenia dla tych usług, ale nie kosztem bezpieczeństwa. Jaki byłby standard i najlepsze praktyki w takim scenariuszu?
Opcje, które przychodzą mi do głowy (lub zostały mi zasugerowane):
Niech usługi klienckie używają „fałszywej” nazwy użytkownika i hasła i uwierzytelniają je w taki sam sposób, jak użytkowników. Nie podoba mi się ta opcja - po prostu nie czuję się dobrze.
Przypisz stały identyfikator aplikacji dla usługi klienta, być może także klucz aplikacji. O ile zrozumiałem, jest to to samo, co posiadanie nazwy użytkownika i hasła. Za pomocą tego identyfikatora i klucza mogę uwierzytelnić każde żądanie lub utworzyć token uwierzytelniający do uwierzytelniania kolejnych żądań. Tak czy inaczej, nie podoba mi się ta opcja, ponieważ każdy, kto może zdobyć identyfikator aplikacji i klucz, może podszyć się pod klienta.
Mógłbym dodać sprawdzenie adresu IP do poprzedniej opcji. Utrudniłoby to wykonywanie fałszywych żądań.
Certyfikaty klienta. Skonfiguruj własny urząd certyfikacji, utwórz certyfikat główny i utwórz certyfikaty klienta dla usług klienckich. Przychodzi jednak na myśl kilka kwestii: a) w jaki sposób mogę nadal zezwalać użytkownikom na uwierzytelnianie bez certyfikatów oraz b) jak skomplikowany jest ten scenariusz do wdrożenia z punktu widzenia obsługi klienta?
Coś jeszcze - muszą tam być inne rozwiązania?
Moja usługa działałaby w Javie, ale celowo pominąłem informacje o tym, na jakim konkretnym frameworku będzie zbudowana, ponieważ bardziej interesują mnie podstawowe zasady, a nie szczegóły implementacji - zakładam, że najlepsze rozwiązanie będzie być możliwe do wdrożenia niezależnie od podstawowej struktury. Jednak jestem trochę niedoświadczony w tym temacie, więc konkretne wskazówki i przykłady dotyczące rzeczywistego wdrożenia (takie jak przydatne biblioteki stron trzecich, artykuły itp.) Będą również bardzo mile widziane.