Próbuję zaimplementować delegowaną autoryzację w internetowym interfejsie API dla aplikacji mobilnych przy użyciu protokołu OAuth 2.0. Zgodnie ze specyfikacją niejawny przepływ uprawnień nie obsługuje tokenów odświeżania, co oznacza, że po przyznaniu tokenu dostępu na określony czas użytkownik musi ponownie udzielić uprawnień aplikacji po wygaśnięciu tokenu lub jego unieważnieniu.
Wydaje mi się, że jest to dobry scenariusz dla jakiegoś kodu javascript działającego w przeglądarce, jak wspomniano w specyfikacji. Próbuję zminimalizować czas, w którym użytkownik musi przyznać uprawnienia aplikacji, aby uzyskać token, więc wygląda na to, że przepływ kodu autoryzacji jest dobrą opcją, ponieważ obsługuje tokeny odświeżania.
Wydaje się jednak, że ten przepływ w dużym stopniu opiera się na przeglądarce internetowej do wykonywania przekierowań. Zastanawiam się, czy ten przepływ jest nadal dobrą opcją dla aplikacji mobilnej, jeśli używana jest wbudowana przeglądarka internetowa. Czy powinienem iść z ukrytym przepływem?
Odpowiedzi:
Wyjaśnienie: aplikacja mobilna = aplikacja natywna
Jak stwierdzono w innych komentarzach i kilku źródłach online, domniemanie wydaje się być naturalnym rozwiązaniem dla aplikacji mobilnych, jednak najlepsze rozwiązanie nie zawsze jest jednoznaczne (i w rzeczywistości nie jest zalecane z powodów omówionych poniżej).
Sprawdzone metody dotyczące aplikacji natywnej OAuth2
Niezależnie od wybranego podejścia (jest kilka kompromisów do rozważenia), należy zwrócić uwagę na najlepsze praktyki opisane tutaj dla aplikacji natywnych korzystających z OAuth2: https://tools.ietf.org/html/rfc8252
Rozważ następujące opcje
Domniemany
Czy powinienem używać ukrytego?
Cytując z sekcji 8.2 https://tools.ietf.org/html/rfc8252#section-8.2
Kod autoryzacji
Jeśli zdecydujesz się na kod autoryzacji, jednym ze sposobów byłoby proxy za pośrednictwem własnego komponentu serwera internetowego, który wzbogaca żądania tokenu o klucz tajny klienta, aby uniknąć przechowywania go w aplikacji rozproszonej na urządzeniach.
Fragment poniżej z: https://dev.fitbit.com/docs/oauth2/
Wniosek
Ostateczna decyzja powinna uwzględniać pożądane wrażenia użytkownika, ale także apetyt na ryzyko po przeprowadzeniu właściwej oceny ryzyka dla wybranych podejść i lepszym zrozumieniu konsekwencji.
Świetna lektura jest tutaj https://auth0.com/blog/oauth-2-best-practices-for-native-apps/
Inny to https://www.oauth.com/oauth2-servers/oauth-native-apps/, który stwierdza
Uwzględnienie PKCE
Powinieneś również wziąć pod uwagę PKCE, które jest opisane tutaj https://www.oauth.com/oauth2-servers/pkce/
W szczególności, jeśli wdrażasz również serwer autoryzacji, https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/ stwierdza, że należy
Uwzględnienie widoków internetowych
Istnieje wiele przykładów korzystania z widoków internetowych, np. Wbudowanego klienta użytkownika, ale należy unikać tego podejścia (zwłaszcza gdy aplikacja nie jest własna), aw niektórych przypadkach może spowodować zakaz używania interfejsu API jako fragmentu poniżej stąd demonstruje
W celu dalszego wyjaśnienia, oto cytat z tej sekcji z poprzedniego projektu odnośnika do najlepszych praktyk podanego powyżej
Poruszono również kilka interesujących kwestii: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- za
źródło
Niestety nie wydaje mi się, aby istniała jasna odpowiedź na to pytanie. Oto jednak opcje, które zidentyfikowałem:
Jeśli możesz poprosić użytkownika o jego / jej poświadczenia, użyj poświadczeń hasła właściciela zasobu . Jednak może to nie być możliwe z pewnych powodów, a mianowicie
Jeśli wymagane jest użycie przepływu opartego na przeglądarce, użyj przepływu kodu autoryzacji . Tutaj definicja
redirect_uri
jest dużym wyzwaniem, dla którego istnieją następujące opcje:redirect_uri
(np.urn:ietf:wg:oauth:2.0:oob
) Sygnalizuje punktowi końcowemu autoryzacji, aby wyświetlał kod autoryzacji zamiast przekierowywania z powrotem do aplikacji klienckiej. Użytkownik może ręcznie skopiować ten kod lub aplikacja może spróbować uzyskać go z tytułu dokumentu HTML.localhost
serwera przy urządzeniu (zarządzanie portem może nie być łatwe).myapp://...
), Który po wyłuskowaniu wywołuje zarejestrowaną „procedurę obsługi” (szczegóły zależą od platformy mobilnej).Mam nadzieję że to pomoże
Pedro
źródło
TL; DR: Przyznanie kodu autoryzacji z PKCE
1. Niejawny typ przyznania
Niejawny typ grantu jest dość popularny w aplikacjach mobilnych. Ale to nie miało być używane w ten sposób. Wokół przekierowania istnieją obawy dotyczące bezpieczeństwa. Justin Richer stwierdza :
A wraz z tym, że nie pozwala odświeżyć tokena dostępu, lepiej tego unikaj.
2. Typ nadania kodu autoryzacji
Przyznanie kodu autoryzacji wymaga klucza tajnego klienta. Nie należy jednak przechowywać poufnych informacji w kodzie źródłowym aplikacji mobilnej. Ludzie mogą je wyodrębnić. Aby nie ujawniać tajemnicy klienta, musisz uruchomić serwer jako pośrednik, jak pisze Facebook :
Nie jest to idealne rozwiązanie, ale jest nowy, lepszy sposób wykonywania OAuth na urządzeniach mobilnych: Proof Key for Code Exchange
3. Typ nadania kodu autoryzacji z PKCE (klucz potwierdzający wymianę kodu)
Z ograniczeń stworzono nową technikę, która umożliwia korzystanie z kodu autoryzacyjnego bez klucza klienta. Możesz przeczytać pełny dokument RFC 7636 lub to krótkie wprowadzenie .
z https://oauth.net/2/pkce/
źródło
Korzystanie z widoku internetowego w aplikacji mobilnej powinno być niedrogim sposobem implementacji protokołu OAuth2.0 na platformie Android.
Jeśli chodzi o pole redirect_uri, myślę, że
http://localhost
jest to dobry wybór i nie musisz portować serwera HTTP wewnątrz swojej aplikacji, ponieważ możesz przesłonić implementacjęonPageStarted
funkcji wWebViewClient
klasie i zatrzymać ładowanie strony internetowej odhttp://localhost
momentu sprawdzeniaurl
parametru.źródło
Najłatwiejszym sposobem uwierzytelniania i najłatwiejszym do zaimplementowania jest umieszczenie widoku internetowego w aplikacji. Przetwarzaj odpowiedzi otrzymane przez przeglądarkę internetową z punktu uwierzytelniania i wykryj błąd (anulowanie użytkownika) lub zatwierdzenie (i wyodrębnij token z parametrów zapytania adresu URL). Myślę, że możesz to zrobić na wszystkich platformach. Z powodzeniem wykonałem tę pracę dla następujących aplikacji: iOS, Android, Mac, Windows Store 8.1, Windows Phone 8.1. Zrobiłem to dla następujących usług: dropbox, dysk Google, onedrive, box, basecamp. W przypadku platform innych niż Windows korzystałem z platformy Xamarin, która rzekomo nie ujawnia wszystkich interfejsów API specyficznych dla platformy, ale ujawniła wystarczająco dużo, aby było to możliwe. Jest to więc całkiem przystępne rozwiązanie, nawet z perspektywy wielu platform.
źródło