Jak używać OpenID w RESTful API?

Buduję aplikację internetową opartą na pylonach z RESTful API, która obecnie nie posiada żadnego uwierzytelniania. Więc zamierzam to zaimplementować i aby uniknąć kłopotów i ostrożności z przechowywaniem haseł użytkowników, chciałbym użyć OpenID do uwierzytelniania. Jaki byłby najlepszy sposób, aby to zrobić? Czy te dwie rzeczy są kompatybilne? Czy istnieją istniejące API REST, które używają OpenID, z których mogę czerpać inspirację?

Author: Pēteris Caune, 2009-12-02

3 answers

Spędziłem teraz trochę czasu na badaniu opcji i chciałbym podsumować wyniki. Po pierwsze, trochę więcej kontekstu -- rozwijam i kontroluję zarówno usługę, jak i klienta API. Consumer to aplikacja oparta na Flashu, która jest obsługiwana z tego samego hosta, z którego API jest teraz i ma być używana w przeglądarce. Żadnych klientów stron trzecich w zasięgu wzroku.

Więc pytanie można podzielić na dwie części,

  • Jak zrobić uwierzytelnianie OpenID przez API
  • Jak utrzymać stan "uwierzytelniony" w kolejnych żądaniach

W pierwszej części uwierzytelnianie OpenID prawie zawsze zawiera interaktywne kroki. Podczas procesu uwierzytelniania najprawdopodobniej nastąpi krok, w którym użytkownik będzie zalogowany na stronie dostawcy OpenID i naciśnie przycisk "Zgadzam się". API nie może i nie powinno tego robić w sposób przejrzysty (nie "powiedz mi swojego dostawcę OpenID i hasło, a ja zajmę się resztą"). Najlepsze, co może zrobić, to przekazać iz powrotem linki HTTP, które klient musi otworzyć i postępuj zgodnie z instrukcjami.

Utrzymanie stanu "uwierzytelnionego"

REST API powinny być bezpaństwowe, każde żądanie powinno zawierać wszystkie informacje potrzebne do jego obsługi, prawda? Uwierzytelnianie przed dostawcą OpenID nie miałoby sensu dla każdego żądania, więc niektóre sesje są konieczne. Niektóre z opcji przekazywania klucza sesji (lub" token dostępu " lub nazwa użytkownika/hasło) to:

  • HTTPS + basic authentication ("autoryzacja: Podstawowe ..."nagłówek w każdym zapytaniu)
  • Signing requests Amazon-style ("Authorization: AWS ... "nagłówek w każdym zapytaniu)
  • OAuth: zdobądź Token dostępu, Dołącz to i kilka innych parametrów do każdego żądania
  • plik cookie przechowujący klucz sesji ("Cookie:... "nagłówek w każdym zapytaniu)
  • podpisany plik cookie, który przechowuje informacje o sesji w samym pliku cookie

Jest teraz tylko jeden konsument API, więc wybrałem najprostszą rzecz, która może zadziałać ... ciasteczka. Są bardzo łatwe w użyciu w pylonach, za pomocą zlewki . Są one również "po prostu działać" w aplikacji Flash - ponieważ działa w przeglądarce, przeglądarka będzie zawierać odpowiednie pliki cookie w żądaniach, które aplikacja Flash sprawia - aplikacja nie musi być zmieniana w ogóle w odniesieniu do tego. Oto jedno pytanie StackOverflow, które również zaleca używanie Plików cookie: RESTful authentication for web applications

Zlewka ma również ładną funkcję sesje tylko cookie gdzie wszystkie dane sesji są zawarte w samym pliku cookie. Myślę, że to jest tak bezpaństwowe, jak to tylko możliwe. Nie ma żadnego magazynu sesji na serwerze. Pliki cookie są podpisywane i opcjonalnie szyfrowane, aby uniknąć manipulowania nimi po stronie klienta. Wadą jest to, że cookie staje się nieco większy, ponieważ teraz musi przechowywać więcej niż tylko klucz sesji. Usuwając rzeczy, których nie potrzebowałem w sesji (resztki z uwierzytelniania OpenID) otrzymałem Rozmiar pliku cookie do około 200 bajtów.

 30
Author: Pēteris Caune,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:45:36

OAuth {[2] } jest lepszym rozwiązaniem dla API. Oto przykład użycia OAuth w Pythonie: oauth-python-twitter. Biblioteka Leah Culver python-OAuth jest kanoniczną implementacją OAuth w Pythonie, ale python-OAuth2 jest ostatnim konkurentem, który dostaje trochę szumu. Jeśli chodzi o inspirację, django-tłok ma wsparcie dla używania OAuth do tworzenia auth podczas tworzenia RESTful API dla Django, chociaż dokumentacja nie jest tak miła, jak bym tego chciał temat.

 4
Author: Hank Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-02 14:23:29

Jeśli zbudujesz API, możesz sprawdzić protokół OAuth. Uzupełnia OpenID.

 3
Author: MBO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-02 14:25:05