2014-09-10 9 views
10

Uczę się OAuth 2.0 i nie mogę uzyskać sposobu zabezpieczenia tokena dostępu w niejawnym przepływie dotacji. Istnieje kilka tez w specyfikacji i niektóre upvoted odpowiedzi SO patrząc sprzeczne ze sobą. Czy ktoś może to wyjaśnić? Cytaty z tak odpowiedzi i specyfikacji, które mylą mnie:Jak dokładnie działa bezpieczeństwo oparte na fragmentach hash?

  1. (Od specyfikacji) Przekierowanie URI wykorzystywane w celu dostarczenia token dostępu do klienta. Tenken dostępu może być narażony na działanie właściciela zasobów lub innych aplikacji z dostępem do agenta użytkownika właściciela zasobów.
  2. (Z Spec) token dostępu poświadczeń (jak również jakiejkolwiek informacji poufnej token dostępu atrybutów) muszą być traktowane jako poufne w transporcie i magazynowaniu i dzielone tylko między serwerem autoryzacji, serwery Resource token dostępu jest ważna, i klient, któremu wydano token dostępu . Dostęp do danych uwierzytelniających token MUSI być przekazywany tylko za pomocą TLS.
  3. (Od accepted and upvoted SO answer) W niejawnym przepływie token dostępu jest przekazywany jako fragment skrótu, tylko przeglądarki są świadome fragmentu skrótu. Przeglądarki przekazują fragment skrótu bezpośrednio do docelowej strony internetowej/przekierowania URI, który jest stroną klienta (fragment krzyżyka nie jest częścią żądania HTTP), więc należy przeczytać fragment skrótu za pomocą Javascript. Fragmentu hasha nie można przechwycić przez serwery pośredniczące/routery (jest to ważne).

Moje pytanie:

P1 mówi, że żeton dostarczane do klienta za pośrednictwem przekierowania URI i P2 mówi kanał dostawy musi być TLS-ed. Ale P3 mówi, że fragment mieszania nie wysyła do sieci. Jak token dostępu dociera do klienta, jeśli nie wysyła, ponieważ jest to fragment skrótu? W każdym razie, to musi być wysłane przez sieć, prawda? Lub wysyłanie tokena z przekierowaniem URI czyni trochę magii bez ofert sieciowych?

Jedyne prawdopodobne wytłumaczenie - pod maską przeglądarki wysyła tylko nie-mieszkową część adresu URL przez sieć i po załadowaniu nowej strony, wstawia fragment hasha i udostępnia go JS. Jeśli mam rację, nadal nie mogę zrozumieć, dlaczego po prostu nie wysłaliśmy tokena z niezawodnym, zabezpieczonym kanałem HTTPS jako parametrem odpowiedzi?

Odpowiedz

8

OAuth Provider wysyła token dostępu powrotem do OAuth konsumentowi przekierowanie odpowiedzi HTTP:

HTTP/1.1 302 Found 
Location: https://consumer.org/redirect_uri#access_token=1111-2222-3333-4444 

zauważyć, jak token dostępu jest przesyłany przez sieć, jako część odpowiedzi HTTP od dostawcy OAuth , które RÓWNIEŻ powinno być na HTTPS oprócz konsumenta.

Twoja przeglądarka będzie następnie wykonać nowy HTTP GET wniosek do końcowego konsumenta:

GET /redirect_uri HTTP/1.1 
Host: consumer.org 

Uwaga jak token dostępu nie jest wysyłana do odbiorcy za pośrednictwem sieci. Serwer o numerze consumer.org nie otrzyma tokena w tym żądaniu HTTP. Zamiast tego strona internetowa zwrócona z https://consumer.org/redirect_uri będzie zawierała javascript, który jest w stanie odczytać token dostępu z fragmentu adresu URL.

W związku z tym musisz ufać kodowi javascript, który otrzymujesz od consumer.org (przy użyciu HTTPS), ponieważ jeśli osoba atakująca może wstrzyknąć kod, może również pośrednio uzyskać token dostępu (i wysłać go w dowolne miejsce).

Przykład odpowiedzi HTTP z konsumentem:

200 OK 
Content-Type: text/html 

<html><head><script> 
    alert(window.location.hash) 
</script> 
</head><body></body></html> 
+0

o malware kodu JS i HTTPS - tak, prawdopodobnie HTTPS setup na klienta rozwiązuje problem, ale złe JS nie hash-fragment magia wynalazł dla non-HTTPS klienci ? Jeśli fragment hash nie może w pełni obronić się przed atakami takimi jak zły JS, czy nie lepiej po prostu użyć HTTPS na kliencie i wysłać token jako parametr żądania? – Baurzhan

+0

Nie, niejawny przepływ dotacji nie jest dla klientów innych niż https, dotyczy klientów, którzy nie mają zaplecza. Nie ma przepływu, w którym token jest wysyłany jako parametr żądania. W przeciwieństwie do niejawnego przepływu dotacji, przepływ kodu autoryzacji dostarcza "kodu" jako parametr ciągu zapytania do zaplecza klienta. Następnie backend klienta wymienia kod z tokenem (uwierzytelnione żądanie z poświadczeniami klienta) –

Powiązane problemy