Klucze API a uwierzytelnianie HTTP vs OAuth w RESTful API

102

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?

Shauna
źródło
z czym skończyłeś?
Irwin
@Irwin - Zadałem to pytanie już jakiś czas temu i od tego czasu odszedłem od projektu wymagającego tego, ale skończyło się na połączeniu kluczy API i wygenerowanego hasła (którego użytkownicy nigdy nie widzą), które są wysyłane przy użyciu uwierzytelniania HTTP.
Shauna

Odpowiedzi:

67

To zależy od Twoich potrzeb. Czy potrzebujesz:

  • Tożsamość - kto twierdzi, że wysyła żądanie API?
  • Uwierzytelnienie - czy naprawdę są tym, za kogo się podaje?
  • Autoryzacja - czy wolno im robić to, co próbują zrobić?

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/

Sid
źródło
z „określonymi zasobami” masz na myśli „określone wywołania interfejsu API” lub „określone rekordy bazy danych”, czy jedno i drugie?
Magne
Głównie rekordy DB (lub cokolwiek, co ujawnia stan chroniony lub modyfikuje stan). Ale może to być również coś w rodzaju funkcji premium (takiej jak uruchamianie algorytmu w chmurze), która tak naprawdę niczego nie zmienia w bazie danych, ale wykorzystuje zasoby systemowe i powinna być dostępna tylko dla upoważnionych osób.
Sid
@Sid Pracuję nad aplikacją, która wykorzystuje OAuth do rejestracji użytkowników, którzy rejestrują się za pomocą Facebooka lub LinkedIn. Dodatkowo otwieramy nasze API dla innych usług do zarządzania danymi. W takim przypadku czy poleciłbyś OAuth do uwierzytelniania użytkownika oraz klucz API lub kombinację nazwy użytkownika i hasła (jak w artykule, do którego utworzyłeś link) dla usług uzyskujących dostęp do API? Klucze OAuth i API są używane do różnych celów, prawda?
Tom Doe
@TomDoe Cześć Tom - Tak, to ma sens. Prawdopodobnie chcesz teraz korzystać z OAuth2. Jeśli twój serwer jest w Pythonie (Django lub Flask), spójrz na github.com/omab/python-social-auth
Sid
Nie rozumiem, w jaki sposób klucz API nie może zapewnić tych trzech rzeczy. Tożsamość i uwierzytelnianie opierają się na zasadzie „czy znasz konkretny sekret?” (chyba że wprowadzisz 2FA, który jest osobnym tematem). Jeśli podam bardzo długi klucz API Użytkownika 5, to twierdzi i dowodzi, że jestem Użytkownikiem 5, przynajmniej tak samo dobrze, jak nazwa użytkownika / hasło. I nie ma powodu, dla którego nie można by przypisać różnych uprawnień do różnych kluczy API. Dobrze? Czego tu brakuje?
Nathan Long
3

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).

  • Bezpośrednie uwierzytelnianie i autoryzacja : protokoły oparte na kluczach jako wariant tradycyjnych wersji opartych na poświadczeniach.
  • Delegowane uwierzytelnianie i autoryzacja : podobnie jak protokoły oparte na OAuth, które z kolei używają tokenów, ponownie jako wariant wersji opartych na poświadczeniach (ogólnym celem nie jest ujawnienie hasła żadnej stronie trzeciej).

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.

Paolo Maresca
źródło