5

W ciągu ostatnich kilku dni widziałem kilka coraz bardziej problematycznych problemów z długo działającą aplikacją w czasie rzeczywistym. Wykonałem poniższe czynności, a fragment kodu u dołu zawiera dodatkowe informacje o debugowaniu z aplikacji.Google Drive Realtime API OAuth2 Refresh Errors

Po pierwszym uruchomieniu strony żąda tokenu OAuth i ładuje dokument [A] w czasie rzeczywistym. Po 50 minutach (10 minut przed wygaśnięciem tokenu) pomyślnie przesłano żądanie nowego tokenu OAuth [B]. Po wygaśnięciu pierwszego tokenu aktualnie otwarte połączenie otrzymuje nieautoryzowany błąd 401 i wymaga nowego tokenu Oauth [C]. Samo w sobie wydaje się, że jest to problem, ponieważ powinien zaktualizować się, aby użyć nowego ważnego tokena z [B].

Aplikacja powinna jednak być odporna na występujący błąd - należy więc ją zamknąć, ponownie otwierając dokument [D] i pobierając kolejny nowy token OAuth. Niestety w tym momencie interfejs API czasu rzeczywistego znajduje się w nieskończonej pętli, uzyskując błędy dla klucza dostępu [E].

Wszystkie tokeny OAuth są wymagane przy użyciu luki.auth.authorize z tymi samymi zakresami i bez wywołania setToken. Wcześniej próbowałem używać setToken, ale miało to dokładnie te same problemy.

rzeczywistych pytań Co to jest poprawny sposób radzić sobie z orzeźwiający token OAuth dla API w czasie rzeczywistym? Jak mogę zapobiec powtarzającym się awariom wewnętrznym interfejsów API napędów podczas zamykania i ponownego otwierania dokumentu?

[A] 
_aa: "1" 
access_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXz9AYBkyympssqI" 
client_id: "XXXXXXXXXXXXXXXX.apps.googleusercontent.com" 
cookie_policy: undefined 
expires_at: "1373610287" 
expires_in: "3600" 
g_user_cookie_policy: undefined 
issued_at: "1373606687" 
response_type: "token" 
scope: Array[2] 
state: "" 
token_type: "Bearer" 

[B] 
_aa: "1" 
access_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXV2kzG4EMUppi" 
client_id: "XXXXXXXXXXXXXX.apps.googleusercontent.com" 
cookie_policy: undefined 
expires_at: "1373613288" 
expires_in: "3600" 
g_user_cookie_policy: undefined 
issued_at: "1373609688" 
response_type: "token" 
scope: Array[2] 
state: "" 
token_type: "Bearer" 

[C] 
GET https://drive.google.com/otservice/bind?id=1B-XXXXXXXXXXXXXXXXXXXXX_nRizfqmT…&RID=rpc&SID=XXXXXXXXXXXXXXXXX&CI=0&AID=221&TYPE=xmlhttp&zx=ns6e5dr7rf4&t=1 401 (Unauthorized) 

Drive Realtime API Error: token_refresh_required: The OAuth token must be refreshed. 

[D] 
[Close Realtime Document] 
[Open Realtime Document] 

_aa: "1" 
access_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMHzJXm2dF-" 
client_id: "XXXXXXXXXXXXXX.apps.googleusercontent.com" 
cookie_policy: undefined 
expires_at: "1373613918" 
expires_in: "3600" 
g_user_cookie_policy: undefined 
issued_at: "1373610318" 
response_type: "token" 
scope: Array[2] 
state: "" 
token_type: "Bearer" 

[E] 
[x100] Uncaught TypeError: Cannot read property 'o' of null 

Dzięki!

Odpowiedz

9

Przyjrzałem się Twojemu problemowi i myślę, że masz rację co do dwóch głównych problemów.

  1. Odświeżone tokeny nie są automatycznie pobierane przez interfejs API.
  2. Zamykanie i ponowne otwieranie dokumentu prowadzi do okresowych błędów "Nie można odczytać wartości" o "wartości zero.

Jeśli chodzi o numer 1, pobieramy odświeżony token za każdym razem, gdy zmiana jest zapisywana, a także co sekundę, gdy połączenie serwera z klientem jest niezdrowe (np. Po błędzie 401). To oczywiście nie obejmuje przypadku, w którym odświeżysz token wcześniej i nie ma żadnych zmian w dokumencie. W takim przypadku zobaczysz 401, mimo że już zaktualizowałeś token. Pracuję nad poprawką dla tego problemu, która odbiera odświeżony token co 30 sekund, gdy połączenie jest zdrowe. Ostatecznie chcielibyśmy, aby to było zdarzenie sterowane, aby token został natychmiast odebrany, ale jest to nieco bardziej zaangażowane, ponieważ wymaga zmian w pliku gapi.auth.

chodzi o numerze 2, na podstawie moich badań wynika, że ​​okresowe błąd jest nieprawdziwy (wewnętrznie jesteśmy wciąż próbuje odświeżyć token dla starego dokumentu, mimo że dokument został zamknięty, dlatego Ci w ' Nie można odczytać właściwości "błąd". Pracuję nad poprawką do tego również, ale nadal powinieneś być w stanie ponownie załadować dokument (chociaż zobaczysz wiele błędów śmieci dla starego dokumentu). Daj mi znać, jeśli tak nie jest i naprawdę nie możesz ponownie załadować dokumentu.

Należy pamiętać, że nie trzeba ponownie ładować dokumentu, gdy pojawi się błąd odświeżania tokena. Jest to sygnalizowane faktem, że właściwość isFatal obiektu gapi.drive.realtime.Error przekazana do obsługi błędu ma wartość false, co oznacza, że ​​błąd można odzyskać. Sugerowana reakcja na błąd token_refresh_required polega na odświeżeniu tokena - usługa sieciowa powinna automatycznie nadrobić zaległości. Jeśli to nie zadziała, daj nam znać, ponieważ jest to błąd.

- Brian (Realtime API Developer)

+0

Obchodzenie token_refresh_required błąd tylko zaktualizować token był wystarczający, aby rozwiązać ten problem, powtarzającego się błędu. Dziękuję za szybką odpowiedź! –