Pracuję nad zbudowaniem RESTful API dla jednej z aplikacji, które zarządzam. Obecnie szukamy różnych elementów, które wymagają bardziej kontrolowanego dostępu i bezpieczeństwa. Badając, jak zabezpieczyć API, znalazłem kilka różnych opinii na temat tego, jakiej formy użyć. Widziałem niektóre zasoby, które mówią, że HTTP-Auth jest drogą do zrobienia, podczas gdy inne wolą klucze API, a nawet inne (w tym pytania, które znalazłem tutaj na SO) przysięgają na OAuth.
Wtedy oczywiście ci, którzy wolą, powiedzmy, klucze API, mówią, że OAuth jest przeznaczony dla aplikacji uzyskujących dostęp w imieniu użytkownika (jak rozumiem, na przykład do logowania się do witryny innej niż Facebook przy użyciu konta na Facebooku), a nie dla użytkownika bezpośrednio uzyskującego dostęp do zasobów w witrynie, w której się specjalnie zarejestrowali (np. oficjalny klient Twittera uzyskujący dostęp do serwerów Twittera). Wydaje się jednak, że zalecenia dotyczące protokołu OAuth dotyczą nawet najbardziej podstawowych potrzeb uwierzytelniania.
Moje pytanie brzmi więc - zakładając, że wszystko odbywa się przez HTTPS, jakie są praktyczne różnice między tymi trzema? Kiedy jednego należy rozważyć ponad innymi?
źródło
Odpowiedzi:
To zależy od Twoich potrzeb. Czy potrzebujesz:
czy wszystkie trzy?
Jeśli potrzebujesz tylko zidentyfikować rozmówcę, aby śledzić liczbę lub liczbę wywołań interfejsu API, użyj prostego klucza API. Pamiętaj, że jeśli użytkownik, któremu wydałeś klucz API, udostępni go komuś innemu, będzie mógł również wywołać Twoje API.
Ale jeśli potrzebujesz również autoryzacji, to znaczy musisz zapewnić dostęp tylko do określonych zasobów w oparciu o wywołującego API, użyj oAuth.
Oto dobry opis: http://www.srimax.com/index.php/do-you-need-api-keys-api-identity-vs-authorization/
źródło
Klucze API, a nawet Tokeny, należą do kategorii mechanizmów bezpośredniego uwierzytelniania i autoryzacji, ponieważ zapewniają dostęp do ujawnionych zasobów interfejsów API REST. Takie bezpośrednie mechanizmy można wykorzystać w przypadkach użycia delegacji.
Aby uzyskać dostęp do zasobu lub zestawu zasobów udostępnianych przez punkty końcowe REST, należy sprawdzić uprawnienia żądającego zgodnie z jego tożsamością. Pierwszym krokiem przepływu pracy jest następnie weryfikacja tożsamości poprzez uwierzytelnienie żądania; Kolejnym krokiem jest sprawdzenie tożsamości z zestawem zdefiniowanych reguł autoryzacji poziomu dostępu (tj. odczyt, zapis lub odczyt / zapis). Po wykonaniu wspomnianych kroków typową dalszą troską jest dozwolona szybkość żądań , co oznacza, ile żądań na sekundę żądający może wykonać w odniesieniu do danego zasobu (zasobów).
OAuth (Open Authorization) to standardowy protokół dostępu delegowanego , często używany przez duże firmy internetowe do przyznawania dostępu bez podawania hasła. Jak widać, OAuth jest protokołem, który spełnia powyższe wymagania: Uwierzytelnianie i Autoryzacja poprzez zapewnienie bezpiecznego, delegowanego dostępu do zasobów serwera w imieniu właściciela zasobów. Opiera się na mechanizmie Access Tokens, które pozwalają stronie trzeciej uzyskać dostęp do zasobu zarządzanego przez serwer w imieniu właściciela zasobu. Na przykład ServiceX chce uzyskać dostęp do konta Google Johna Smitha w imieniu Johna, gdy John autoryzuje przekazanie; ServiceX otrzyma następnie token czasowy umożliwiający dostęp do szczegółów konta Google, najprawdopodobniej tylko do odczytu.
Koncepcja klucza API jest bardzo podobna do opisanego powyżej tokena OAuth. Podstawowa różnica polega na braku delegacji: Użytkownik zwraca się bezpośrednio do usługodawcy o Klucz do kolejnych interakcji programowych. Przypadek klucza API jest również oparty na czasie: klucz jako token OAuth podlega dzierżawie czasowej lub okresowi wygaśnięcia. Dodatkowym aspektem jest to, że zarówno Klucz, jak i Token mogą podlegać ograniczeniu szybkości w umowie o świadczenie usług, tj. Obsłużyć można tylko określoną liczbę żądań na sekundę.
Podsumowując, w rzeczywistości nie ma rzeczywistej różnicy między tradycyjnymi mechanizmami uwierzytelniania i autoryzacji a wersjami opartymi na kluczu / tokenie. Paradygmat jest jednak nieco inny: zamiast ponownego wykorzystywania poświadczeń przy każdej interakcji między klientem a serwerem, używany jest klucz / token wsparcia, który sprawia, że ogólna interakcja jest płynniejsza i prawdopodobnie bezpieczniejsza (często zgodnie ze standardem JWT , Kluczami i Tokeny są podpisywane cyfrowo przez serwer, aby uniknąć tworzenia).
Obie kategorie używają tradycyjnego przepływu pracy weryfikacji tożsamości przy pierwszej interakcji z serwerem będącym właścicielem zainteresowanych zasobów.
źródło