21

Mam zainstalowaną aplikację obsługującą Dysk Google korzystającą z biblioteki klienta Java języka Java i autoryzacji przepływu serwera.Czy możliwe jest prawidłowe wybranie dowolnego dostępnego konta Google do użycia podczas korzystania z autoryzacji za pośrednictwem biblioteki klienta JS na Dysku?

Jeśli nie jesteś zalogowany w aplikacji i nawigujesz do adresu URL I zalogowałeś się na więcej niż jedno konto Google w tej przeglądarce (możliwe jest tylko jedno osobiste konto Google, dodatkowe konta muszą być kontami Google) wywołanie zwrotne OAuth oferuje opcje wyboru konta Google do użycia.

Jednak podczas testowania przełącznika do korzystania z biblioteki klienta JavaScript nie jestem w stanie aktywować ekranu wyboru wielu kont za pomocą gapi.auth.authorize. Czy możliwe jest obsługiwanie wielu kont za pomocą biblioteki JS?

Aktualizacja: próbowałem z parametrem immediatefalse. Mogę się zalogować, o ile nie zmieniam konta w popupie. Jeśli mam zmienić konto, mogę:

https://accounts.google.com/o/oauth2/auth?client_id=433863057149.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/drive.file+https://www.googleapis.com/auth/drive.install+https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile&immediate=false&redirect_uri=postmessage&origin=https://drivedrawio.appspot.com&proxy=oauth2relay593063763&response_type=token&state=701344514&authuser=1

w nowej karcie i nic się nie dzieje. Mam made a video to demonstrate.

Aktualizacja 2: This bug dla biblioteki klienta JS dla potrzeby podwójnego wyboru konta mulitple została zaakceptowana.

Odpowiedz

42

Nie otrzymujesz ekran wyboru użytkownika wielofunkcyjnego z powodu następującego parametru: authuser=0 ten automatycznie wybiera pierwsze konto jesteś zalogowany-in (authuser=1 wybierze drugi itd ...).

Obecnie nie można usunąć tego parametru za pomocą biblioteki klienta, ponieważ biblioteka klienta ustawia go automatycznie na 0 (dlatego nie obsługuje wielu kont), jeśli nie ma żadnej wartości, więc jednym ze sposobów jest zastąpienie go do -1 na przykład, to pokaże wybieracz wielu kont. Następnie możesz również poprosić o dostęp do user's profile or email w tym samym czasie, gdy poprosisz o dostęp do innych interfejsów API i pobierzesz wiadomość e-mail od użytkownika lub jej identyfikatora. Następnie przy kolejnym uwierzytelnieniu można określić parametr user_id, który pominie ekran wyboru użytkownika.

Więc w praktyce, najpierw autoryzować tak:

gapi.auth.authorize({client_id: <Your Client ID>, 
        scope: 'https://www.googleapis.com/auth/drive openid', // That requires access to Google Drive and to the UserInfo API 
        authuser: -1}); 

Jedyny problem z powyższego jest to, że auto-odświeżania biblioteki klienta nie będzie działać, ponieważ każdy auth będzie być zablokowane na multi-konta ekran wyboru.

Sztuką jest, aby uzyskać identyfikator użytkownika za pomocą interfejsu API UserInfo, zapisać ten identyfikator w pliku cookie sesji i używać go na kolejnym auth tak:

gapi.auth.authorize({client_id: <Your Client ID>, 
        scope: 'https://www.googleapis.com/auth/drive openid', 
        user_id: <The User ID>, 
        authuser: -1}); 

Określanie identyfikator użytkownika będzie upewnić się, że selektor wielu kont jest pomijany i pozwoli na automatyczne ponowne uruchomienie tokena z biblioteki klienta.

Dla porównania, inne param URL, które mają wpływ na przepływ użytkownika są:

  • user_id: podobne niż authuser (omija ekran wyboru multi-konta), ale można korzystać z adresu e-mail (np [email protected]) lub identyfikator użytkownika otrzymany z punktu końcowego Open ID Connect/Google + API/UserInfo API
  • approval_prompt: domyślnie jest to auto, można ustawić na force, aby upewnić się, że ekran zatwierdzenia/udzielenia zostanie wyświetlony. Zapewnia to, że ekran główny nie zostanie ominięty przy kolejnym uwierzytelnieniu (po pierwszym czasie).
  • immediate: immediate jest nieco kłopotliwe, gdy ustawiono true będzie ominąć ekran Grant (trochę jak approval_prompt=auto) jeśli użytkownik już zatwierdziły wcześniej, ale jeśli użytkownik nie przyznało zatwierdzenie wcześniej dostaniesz przekierowany z błędem : error=immediate_failed. Ustawienie na false nie spowoduje dodania specjalnego zachowania, a więc powrotu do ustawień zachowania przez wartość approval_prompt.

Uwaga: immediate=true i approval_prompt=force jest nieprawidłową kombinacją.

myślę, że biblioteka klient używa immediate param tak, że jeśli dostaje error=immediate_failed będzie ponownie uruchomić przepływ auth bez authuser param, ale to tylko spekulacje :)

+0

Podczas, gdy technicznie odpowiedziałeś na pytanie "Jak uzyskać monit o to, które konto Google ma być używane podczas korzystania z biblioteki klienta JS na Dysku?", Moje pytanie było w rzeczywistości błędnie zatytułowane, przepraszam :). – David

+0

Właśnie odpowiedziałem, ponieważ wiem lepiej, jak działają nasze punkty końcowe OAuth niż biblioteka klienta JS: D Nie wiedziałem, że nie działa z kontami wielu użytkowników:/ – Nivco

+0

Gdzie znalazłeś ten parametr? Nie można go znaleźć w https://developers.google.com/+/web/api/javascript – chulian

3

Strona dostępu do autoryzacji OAuth jest wyświetlana tylko wtedy, gdy nie jest w trybie natychmiastowym, czy działa zgodnie z oczekiwaniami, jeśli parametr immediate ustawiono na wartość false?

+0

To daje stronę dostępu do dotacji, ale nie ekran wyboru konta, który powinien go poprzedzać. –

0

Należy zwrócić uwagę na parametr authuser. Ustaw na przykład na "2", a użytkownik zostanie poproszony o zalogowanie, nawet jeśli jesteś już uwierzytelniony.