2012-12-22 26 views
15

Jaka jest wartość używania tokena uwierzytelniania podczas korzystania z usługi sieciowej REST zamiast wysyłania nazwy użytkownika, hasła przez HTTPS/szyfrowanie przy każdym żądaniu?Jaki jest sens używania tokenów uwierzytelniania w usługach REST?

Rozumiem, że na przykład OAUTH ma pewne zalety, ponieważ nie musisz podawać swojego hasła stronom trzecim, możesz przekazać token zaufanym stronom trzecim, którym nie chcesz udostępniać nazwy użytkownika/hasła..etc

Ale poza tymi specjalnymi korzyściami, powyżej których na pewno nie potrzebuję w moim przypadku, dlaczego miałbym używać tokenów zamiast wysyłać nazwę użytkownika/hasło za każdym razem.

Może to ułatwić życie klientowi i nie musi za każdym razem wysyłać nazwy użytkownika/hasła. No dobrze, ale teraz klient musi zapamiętać mój token i wysłać token na każde żądanie. Więc zamiast zapamiętywać/wysyłać nazwę użytkownika/hasło, teraz zrobi to samo dla tokenów! Tak więc kod wdrożenia klienta nie jest mniejszy.

Jaka jest tutaj prawdziwa wartość?

Odpowiedz

10

To naprawdę zależy od scenariusza. - trudno powiedzieć, nie znając więcej o API - ale użycie "tokenów uwierzytelniania" jest daleka od uniwersalności, masz rację, że wiele interfejsów API nie potrzebuje (i nie używa ich). Wiele interfejsów API po prostu wymaga wysłania klucza API przy każdym żądaniu (często za pośrednictwem protokołu HTTPS, aby zapobiec przechwyceniu) lub wymagają klucza API do identyfikacji użytkownika, a także podpisu cyfrowego z "tajnym kluczem" w celu potwierdzenia tożsamości użytkownika (patrz When working with most APIs, why do they require two types of authentication, namely a key and a secret?). często używane w publicznych interfejsach API, ponieważ nie są wystarczająco elastyczne i nie zapewniają wystarczającej "separacji" między tożsamością użytkownika a tożsamością aplikacji. Na przykład. rejestrujesz się jako programista do korzystania z interfejsu API Flickr i tworzysz aplikację na iPhone'a, która korzysta z tego API - czy naprawdę chcesz, aby Twoja nazwa użytkownika/hasło programisty było wbudowane w aplikację? Co się stanie, jeśli później zmienisz hasło? Co zrobić, jeśli chcesz opracować 5 aplikacji i śledzić ich użycie osobno i mieć możliwość wyłączenia dowolnej aplikacji w dowolnym momencie bez wpływu na pozostałe?

Jednak w przypadkach, gdy naprawdę chcesz zidentyfikować tylko użytkownika, a nie aplikację (np. Prywatny back-end API, który będzie obsługiwał tylko twoje aplikacje, a nie publiczny interfejs API), w większości sytuacji nie robię tego. • widzisz wszystko, co jest nie tak, co sugerujesz, np. nazwa użytkownika/hasło przez HTTPS przy każdym żądaniu.Och, przy okazji, tokeny auth mają dodatkową zaletę: są "ograniczone" (mogą wygasać w określonym czasie, mogą być ograniczone tylko do niektórych działań, itp.), Ale oczywiście jest to użyteczne tylko w bardzo specyficznych sytuacjach.

RÓWNIEŻ: Jako użytkownik "Dan" wskazał powyżej, podczas projektowania interfejsu API, który wymaga wysłania nazwy użytkownika/hasła przy każdym żądaniu (lub na każde żądanie naprawdę, nawet jeśli jest to tylko żądanie logowania), należy uważać, jak to robisz to. Jeśli używasz techniki obsługiwanej domyślnie przez przeglądarkę (np. HTTP Basic Auth), uniemożliwiasz sobie narażanie interfejsu API bezpiecznie dla użytkowników z różnych domen (tzn. Najprawdopodobniej Twój interfejs API nigdy nie będzie bezpiecznie wywoływany bezpośrednio z przeglądarki , tj. z kodu AJAX/Flash/Silverlight).

Jest to złożony temat, którego nie można w pełni wyjaśnić tutaj, ale należy pamiętać, że jeśli interfejs API opiera się na wszelkich poświadczeniach bezpieczeństwa, które przeglądarka może zapamiętać, a następnie "cicho" wprowadza każde żądanie (np. HTTP Basic Auth , ciasteczka), to NIE jest bezpieczne włączanie dostępu międzydomenowego do tego interfejsu API przy użyciu dowolnej techniki międzydomenowej (CORS, JSONP, crossdomain.xml, itp.).

+0

wszystkie wielkie informacje, ale jestem zdezorientowany, 1- Jak powinienem wysłać hasło do mojej usługi REST Jersey, planowałem wysłać nagłówek HTTP. 2 - Czy mógłbyś wyjaśnić, co masz na myśli przez "wtedy NIE jest bezpieczne włączanie dostępu międzydomenowego do tego interfejsu API przy użyciu dowolnej techniki międzydomenowej" Nie mam zielonego pojęcia, co to może oznaczać :) – Spring

+0

Znowu wszystko zależy od Scenariusz. Czy jest to publiczny interfejs API dla wielu programistów lub prywatny, który zapewnia zaplecze dla własnych aplikacji? Czy próbujesz uwierzytelnić aplikację za pomocą interfejsu API lub użytkownika końcowego? Wszystko, co napisałem w drugim akapicie (dotyczące dostępu międzydomenowego) ma znaczenie tylko wtedy, gdy jest to publiczny interfejs API * i * chcesz, aby ludzie mogli uzyskać do niego dostęp z poziomu przeglądarki (np. Z kodu AJAX, z Flasha lub z Silverlight). We wszystkich innych przypadkach możesz zignorować te rzeczy. –

+0

tnx tutaj moja aplikacja jest wyjaśniona; http://stackoverflow.com/questions/13997040/jersey-request-for- authentication – Spring

1

Najlepszym sposobem na udzielenie odpowiedzi jest wskazanie na stronie this opisującej zabezpieczenia REST. Należy do wiki serwisu, nie do Jersey, ale można go zastosować zarówno w Jersey, jak iw obu wersjach REST.

ten jest uzyskiwany z linkiem I pod warunkiem że:

„dla najbardziej oporu, serwer może zaprezentować klientowi tokenem autoryzacji poziomu aplikacji, nieprzezroczysty wartość, którą serwer może zweryfikować należy do prawej uwierzytelniony użytkownik .

  • Taki znak powinien być trudne dla osoby trzeciej, aby obliczyć, np MD5 lub SHA1 hash serwera solone referencji identyfikacji użytkownika.

  • aby pokonać XSRF, jes s token poziomu aplikacji musi być przesłany za pomocą tego, że agent użytkownika nie zwraca automatycznie z każdym żądaniem. Na przykład, może to być wysłane w HTML formularza jako pola ukrytego i wrócił poprzez POST w kodowanym podmiotu postaci „

+1

Ale osoba trzecia ma zawsze dostęp do metody "/ login" Rest, która może "pobrać" token z serwera, jeśli odgadnie nazwę użytkownika/hasło? – Spring

+0

również możesz wyjaśnić, co masz na myśli przez "agent użytkownika nie zwraca automatycznie z każdym żądaniem". Więc jeśli moja metoda jest "GET", nie odeślę jej z powrotem w nagłówku żądania? – Spring

+0

Zaktualizowałem moją odpowiedź. –