2011-11-03 28 views
142

Buduję aplikację, która będzie hostowana na serwerze. Chcę zbudować API dla aplikacji, aby ułatwić interakcję z dowolnej platformy (aplikacji internetowej, aplikacji mobilnej). Nie rozumiem, że podczas korzystania z interfejsu REST API, w jaki sposób uwierzytelniamy użytkownika.Uwierzytelnianie API REST

Na przykład, gdy użytkownik zalogował się, a następnie chce utworzyć temat forum. Skąd będę wiedzieć, że użytkownik jest już zalogowany?

+3

Prawdopodobnie powinieneś wyszukać "Uwierzytelnianie REST" tutaj. Zostało to poruszone w wielu innych kwestiach. –

+9

W skrócie, pozwól klientowi wysłać nazwę użytkownika i hasło przy każdym żądaniu za pomocą protokołu HTTP Basic Auth (przez SSL!) Lub uwierzytelnij raz, aby klient miał uwierzytelnioną sesję, która wygaśnie po pewnym okresie bezczynności (lub jednak zdecydujesz się na nadpisuje "obsługę sesji w ramach sieci WWW". Sesja ta może być następnie przechowywana w pliku cookie lub może być parametrem przekazywanym przy każdym żądaniu (np. JSESSIONID w języku Java). – opyate

+0

Zobacz także [Jak kontrolować, kto używa mojego widżetu internetowego] (http://stackoverflow.com/questions/12998701/how-to-control-who-uses-my-web-widget/). – Arjan

Odpowiedz

56

Można użyć uwierzytelniania HTTP Basic lub Digest. Możesz bezpiecznie uwierzytelniać użytkowników za pomocą protokołu SSL na wierzchu, jednak spowalnia to API.

  • Podstawowe uwierzytelnianie - używa kodowania Base64 na nazwę użytkownika i hasło
  • uwierzytelniania Digest - skróty nazwy użytkownika i hasła przed wysłaniem ich przez sieć.

OAuth jest najlepszy, jaki można uzyskać. Zalety oAuth daje token revokable lub expirable. Zobacz poniżej, jak zaimplementować: Working Link z komentarzy: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

+4

Proszę przeczytaj [to pytanie] (http://stackoverflow.com/questions/454355/security-of-rest- authenthentication- schematy) i odpowiedź udzielona przez Les Hazelwood (autor Apache Shiro). –

+3

Link jest uszkodzony. – FreeAsInBeer

+2

link roboczy: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf – teksan

6

Myślę, że najlepszym podejściem jest użycie OAuth2. Google to, a znajdziesz wiele przydatnych wpisów, które pomogą Ci skonfigurować.

Ułatwi to tworzenie aplikacji klienckich dla interfejsu API z poziomu aplikacji internetowej lub mobilnej.

Mam nadzieję, że to pomoże.

+2

Przeczytaj [to pytanie] (http: // /stackoverflow.com/questions/454355/security-of-rest- authenthentication-schemes) i odpowiedź Les Hazelwood (autor Apache Shiro). –

101

Dla np. kiedy użytkownik ma login. Teraz możemy powiedzieć, że użytkownik chce utworzyć forum, Skąd będę wiedział, że użytkownik jest już zalogowany?

Pomyślcie o tym - musi być jakiś uścisk dłoni, który mówi interfejsowi API "Stwórz forum", że to bieżące żądanie pochodzi od uwierzytelnionego użytkownika. Ponieważ interfejsy API REST są zwykle bezpaństwowcami, stan musi być utrwalony gdzieś. Twój klient korzystający z interfejsów REST API jest odpowiedzialny za utrzymanie tego stanu. Zwykle jest w formie pewnego tokena, który jest przekazywany od czasu zalogowania użytkownika. Jeśli token jest dobry, twoja prośba jest dobra.

Sprawdź, jak usługa Amazon AWS uwierzytelnia się. To doskonały przykład "przekazywania pieniędzy" z jednego API do drugiego.

* Pomyślałem o dodaniu praktycznej odpowiedzi do poprzedniej odpowiedzi. Wypróbuj Apache Shiro (lub dowolną bibliotekę autoryzacji/autoryzacji). Podsumowując, spróbuj uniknąć niestandardowego kodowania.Kiedy już zintegrowany swoją ulubioną bibliotekę (używam Apache Shiro, btw) można następnie wykonaj następujące czynności:

  1. utworzyć login/wylogowania API jak: /api/v1/login i api/v1/logout
  2. W tych logowania i wylogowania API, wykonaj uwierzytelnianie z sklepu użytkownika
  3. efektem jest wyrazem (zwykle JSESSIONID), który jest wysyłany do klienta (web, mobile, cokolwiek)
  4. Od tego momentu, wszystkie kolejne połączenia wykonywane przez klienta będzie zawierać ten token
  5. Załóżmy, że następne połączenie zostanie wykonane do API o nazwie /api/v1/findUser
  6. Pierwszą rzeczą ten kod API będzie zrobić, to sprawdzić tokena („jest użytkownik uwierzytelniony?”)
  7. Jeśli odpowiedź wraca jako NIE, wówczas klient otrzymuje stan HTTP 401 . Pozwól im sobie z tym poradzić.
  8. Jeśli odpowiedź brzmi TAK, a następnie przystąpić do zwrotu poszukiwane instrukcje

To wszystko. Mam nadzieję że to pomoże.

+0

Więc to, co opisujesz, jest zasadniczo plikiem cookie sesji, prawda? – LordOfThePigs

+0

tak, ale sesja jest "utrzymywana" w 2 różnych miejscach. Jeden na serwerze API, drugi w przeglądarce. Odpowiedź JSON (lub coś podobnego) z powrotem do pomyślnego zalogowania się przeglądarki powinna przekazywać identyfikator sesji na serwerze API z powrotem do przeglądarki. Te sesje są niezależnie zarządzane przez odpowiednich agentów. – Kingz

+0

@Kingz: To brzmi dokładnie jak pliki cookie sesji. W przypadku plików cookie sesji serwer zachowuje identyfikator sesji i kojarzy go z danym użytkownikiem. Przeglądarka przechowuje następnie ten identyfikator w pliku cookie, który wysyła do serwera za każdym razem. Nie jestem pewien, co masz na myśli, mówiąc "utrzymywane" w 2 różnych miejscach, chyba że masz na myśli zapisanie tokena. – Chris

31
  1. Zastosowanie Podstawowe HTTP Auth do uwierzytelniania klientów, ale traktować nazwę użytkownika/hasło, tylko jak tymczasowego sesji tokena.

    Token sesja jest tylko nagłówek dołączone do każdą prośbę HTTP, np Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    Ciąg Ym9ic2Vzc2lvbjE6czNjcmV0 powyżej jest tylko napis „bobsession1: s3cret” (która to nazwa użytkownika/hasło) zakodowane w base64 .

  2. Aby uzyskać sesję tymczasowego tokenu powyżej, zapewniają funkcję API (np: http://mycompany.com/apiv1/login), która zajmuje master-login i master-hasło jako wejście, tworzy tymczasowy podstawowym uwierzytelnianiem HTTP login/hasło na stronie serwera, a zwraca token (np. Ym9ic2Vzc2lvbjE6czNjcmV0). Ta nazwa użytkownika/hasło powinny być tymczasowe, powinny wygasnąć po około 20 minutach.

  3. Dla zwiększenia bezpieczeństwa zapewnić usługi REST są podawane za pośrednictwem protokołu HTTPS, tak aby informacje te nie są przesyłane tekstem jawnym

Jeśli jesteś na Javie, biblioteka Wiosna Security zapewnia dobre wsparcie w celu realizacji wyżej metody

+1

Dlaczego powinna wygasać po 20 min? co jeśli jest to strona internetowa taka jak Facebook, że logowanie jest do momentu wylogowania się użytkownika? – Dejell

+1

@dejel Byłem pod założeniem "sesja" ma charakter tymczasowy. Powszechne jest jego wygaśnięcie, jeśli użytkownik nie pracuje – gerrytan