5

Son birkaç gündür uzun süren bir gerçek zamanlı uygulama ile giderek artan sorunlu sorunlar görüyorum. Aşağıdaki adımları yürüttüm ve alt kısımdaki kod snippet'i uygulamadan ek hata ayıklama bilgisi içeriyor.Google Drive Gerçek Zamanlı API OAuth2 Yenileme Hataları

Sayfa ilk açıldığında, başarıyla bir OAuth belirteci ister ve gerçek zamanlı belgeyi [A] yükler. 50 dakika sonra (belirtecin sonlanmasından 10 dakika önce), yeni bir OAuth jetonunu başarıyla tekrar talep eder [B]. İlk belirtecin süresi dolduğunda, şu anda açık bağlantı 401 yetkisiz bir hata alır ve yeni bir oauth belirteci gerektirir [C]. Bu kendi başına yeni geçerli belirtecin [B] 'den kullanılması için güncellenmesi gerektiği gibi bir problem gibi görünüyor. Bununla birlikte, uygulama yine de bu gibi bir hataya karşı esnek olmalıdır - bu yüzden dokümanı [D] 'yi kapatarak ve tekrar açarak ve yeni bir OAuth jetonu alarak ele alınır. Ne yazık ki bu noktada, gerçek zamanlı API, access_token [E] için hatalar elde eden sonsuz bir döngüde oturur.

Tüm OAuth jetonları gapi.auth.authorize kullanılarak aynı kapsamda ve setToken çağrısı olmadan istenir. Daha önce setToken kullanarak denedim, ama aynı sorunları vardı.

Güncel Sorular Gerçek zamanlı API için OAuth belirtecini yenilemenin üstesinden gelmenin doğru yolu nedir? Bir dokümanı kapatırken ve yeniden açtığınızda sürücü API'lerinde dahili olarak tekrarlanan hataları nasıl önleyebilirim?

[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 

Teşekkürler!

cevap

9

Sorununuza bir göz attım ve iki ana sorun hakkında doğru olduğunu düşünüyorum.

  1. Yenileme jetonları API tarafından otomatik olarak alınmaz.
  2. Bir belgenin kapatılması ve yeniden açılması, periyodik olarak "Boş" özelliği "okunamaz" hatalarına yol açar.

Sorun 1 ile ilgili olarak, sunucuya istemci bağlantısı yapılırken (örneğin, 401 hatası sonrası) bir değişiklik kaydedildiğinde ve her saniyede bir yenilenen jetonu alırız. Açıkça görülemeyen şey, belgeyi erken yenilemeniz ve belgede herhangi bir değişiklik olmaması durumudur. Bu durumda, jetonu zaten güncellediğiniz halde 401 görürsünüz. Bağlantıyı sağlıklı yaparken, her 30 saniyede bir yenilenen jetonu alacak olan bu sorun için bir düzeltme üzerinde çalışıyorum. Nihayetinde bu olayın gerçekleşmesini istiyoruz, öyle ki, belirteç hemen alınacak, ancak bu biraz daha fazla ilgiliydi çünkü gapi.auth'da değişiklikler gerektirecek.

Sorun 2 ile ilgili olarak, sınamalarıma dayanarak, periyodik hatanın parazitli olduğu ortaya çıkıyor (dahili olarak, belgenin kapatılmasa bile eski belgenin belirtecini yenilemeye çalışıyoruz, bu yüzden " Mülkün hatası okunamıyor. Bunun için de bir düzeltme üzerinde çalışıyorum, ancak yine de belgeyi yeniden yükleyebilmeniz gerekir (eski belge için çok fazla çöp hatası göreceksiniz). Bu durum söz konusu değilse lütfen bana bildirin ve belgeyi gerçekten yeniden yükleyemezsiniz.

Sana bir belirteç yenileme hatası alınca belgeyi yeniden gerekmez unutmamalıdır. Bu, hata işleyicinize aktarılan gapi.drive.realtime.Error nesnesinin isFatal özelliğinin yanlış olduğu gerçeği ile gösterilir, bu da hatanın geri alınabilir olduğunu gösterir. Bir token_refresh_required hatasında önerilen yanıt, tokenın yenilenmesidir - şebeke servisi otomatik olarak yakalanmalıdır. Bu işe yaramazsa, lütfen bir hata olduğu için bana bildirmekten çekinmeyin.

- Brian (Gerçek Zamanlı API Geliştirici) sadece belirteci güncellemek için token_refresh_required hatayı Handling

+0

tekrarlanan hata sorunu çözmek için yeterliydi. Hızlı cevabınız için teşekkür ederim! –