Uwierzytelnianie za pomocą OAuth2 dla aplikacji * i * strony internetowej

Opracowuję stronę internetową, do której dostęp uzyskuje się głównie za pośrednictwem aplikacji, i chcę używać OAuth2 do rejestracji i uwierzytelniania użytkowników. Ponieważ jest to aplikacja na Androida, zacznę korzystać z Google OAuth2, ponieważ zapewnia ona przyzwoity interfejs użytkownika na Androida.

Google tak twierdzi„Możesz wybrać system uwierzytelniania Google jako sposób na outsourcing uwierzytelniania użytkownika dla swojej aplikacji. Może to wyeliminować potrzebę tworzenia, utrzymywania i zabezpieczania nazwy użytkownika i magazynu haseł”. co chcę zrobić.jednak kiedy przeglądam wszystkie ich przykłady i nie wiem, mogę znaleźć tylko informacje o posiadaniu strony internetowejlub aplikacja uwierzytelnia użytkownika przed usługami Google.

I rzeczywiście, kiedy idę zarejestrować moją aplikację („klienta”) za pomocą Google OAuth2, istnieją opcje dla klientów internetowych i „zainstalowanych” klientów (tj. Aplikacji mobilnej), ale nie dla obu. Mogę utworzyć dwóch oddzielnych klientów, ale czytam wersję roboczą OAuth2 i myślę, że będzie problem, który teraz wyjaśnię.

Oto, jak sobie to wyobraziłem:

Użytkownik prosi MyApp o dostęp do swoich prywatnych danych.Aplikacja korzysta z systemu AndroidAccountManager klasa, aby zażądać tokena dostępu do interfejsów API Google.Android mówi użytkownikowi „Aplikacja„ MyApp ”chce uzyskać dostęp do podstawowych informacji w Google. Czy to w porządku?”Użytkownik mówi tak.AccountManager łączy się z serwerem OAuth2 Google za pomocą poświadczeń przechowywanych w telefonie i prosi o podanie tokena dostępu.Zwracany jest token dostępu (który następuje po zielonych liniach).AccountManager zwraca token dostępu do MyApp.MyApp wysyła do MySite żądanie prywatnych danych użytkownika, w tym tokena dostępu.MySite musi zweryfikować użytkownika za pomocą tokena dostępu. Sprawdza poprawność tokenajak opisano tutaj, z Google - „Google, czy ten token jest ważny?”.Co jachcieć dzieje się tak, że Google mówi „Tak, ktokolwiek ci to dał, to rzeczywiście ten użytkownik.”, ale myślę, że tak się stanie (w oparciu o wersję OAuth2 i dokumentację Google), że powie „Nie ma mowy! działa tylko dla MyApp, a Ty jesteś MySite. GTFO! ”.

Więc jak mam to zrobić? I PROSZĘ nie mów „Użyj OpenID” lub „Nie używaj OAuth2” lub innych podobnie nieprzydatnych odpowiedzi. Och i naprawdę chciałbym nadal korzystać z tego, co miłeAccountManager UI zamiast crappy popupWebViews

Edytować

Tymczasowa odpowiedź (zgłoś to, jeśli to zadziała!) Od Nikolaya jest taka, że ​​powinna ona działać, a serwery Google nie będą obchodziły, skąd pochodzi token dostępu. Wydaje mi się to trochę niepewne, ale zobaczę, czy to działa!

Aktualizacja

Zaimplementowałem ten wzór za pomocą Facebooka zamiast Google i całkowicie działa. Serwer OAuth2 nie dba o to, skąd pochodzi token dostępu. Przynajmniej Facebook nie, więc zakładam, że Google też nie.

W związku z tym przechowywanie tokenów dostępu to bardzo zły pomysł! Ale nie chcemy także uderzać w serwery Facebook / Google, aby sprawdzić autentycznośćkażdy żądanie, ponieważ wszystko spowolni. Prawdopodobnie najlepszą rzeczą jest dodanie dodatkowego pliku uwierzytelniającego dla Twojej witryny, który przekazujesz, gdy jego token dostępu zostanie zatwierdzony, ale prostszym sposobem jest potraktowanie tokena dostępowego jak hasła i przechowywanie jego skrótu. Nie musisz go także solić, ponieważ tokeny dostępu są naprawdę bardzo długie. Tak więc powyższe kroki mają postać:

9. MySite musi zweryfikować użytkownika za pomocą tokena dostępu. Najpierw sprawdza pamięć podręczną zhartowanych ważnych tokenów dostępu. Jeśli zostanie znaleziony hash tokena, wie, że użytkownik jest uwierzytelniony. W przeciwnym razie sprawdza się w Googlejak opisano tutaj, z Google - „Google, czy ten token jest ważny?”.

10. Jeśli Google twierdzi, że token dostępu jest nieprawidłowy, informujemy użytkownika o GTFO. W przeciwnym razie Google mówi „Tak, że jest prawidłowym użytkownikiem”, a następnie sprawdzamy naszą zarejestrowaną bazę danych użytkowników. Jeśli ta nazwa użytkownika Google (lub identyfikator Facebooka, jeśli używasz Facebooka) nie zostanie znaleziona, możemy utworzyć nowego użytkownika. Następnie przechowujemy buforowaną wartość tokenu dostępu.

questionAnswers(6)

yourAnswerToTheQuestion