Ошибки обновления OAuth2 API Google Диска в реальном времени (часть 3)

У меня возникают некоторые проблемы с правильным повторным подключением API в реальном времени после выхода ноутбука/телефона из спящего режима/ожидания. API правильно определяет, что ему необходимо обновить токен OAuth, и выдает ошибку, однако после обновления токена API реального времени не может правильно повторно подключиться к удаленной службе. Это чем-то похоже на (часть 2), однако это происходит только через пару часов после потери соединения.

Я ожидаю, что после обновления токена OAuth API реального времени заберет его и повторно синхронизируется с удаленным сервером. Вместо этого кажется, что API реального времени считает, что он находится в допустимом состоянии, и вносит изменения локально, но не выполняет повторную синхронизацию с удаленным сервером.

// Valid Auth Token
Object {state: "", access_token: "ya29.AHES6ZS38RR9kVX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", token_type: "Bearer", expires_in: "3600", client_id: "XXXXXXXXXXXXXXX.apps.googleusercontent.com"…}
_aa: "1"
access_token: "ya29.AHES6ZS38RR9kVX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
client_id: "XXXXXXXXXXXXXXX.apps.googleusercontent.com"
cookie_policy: undefined
expires_at: "1381916402"
expires_in: "3600"
g_user_cookie_policy: undefined
issued_at: "1381912802"
response_type: "token"
scope: Array[3]
state: ""
token_type: "Bearer"

// Current Time
Date.now()
1381912845180 [Wed Oct 16 2013 01:40:45 GMT-0700 (Pacific Daylight Time)]

// <<Computer Sleep For Hours>>
Uncaught Error: Authentication error: No token set api:462

Drive Realtime API Error: token_refresh_required: The OAuth token must be refreshed. api:464
Doc Load Error:  Rw {type: "token_refresh_required", message: "The OAuth token must be refreshed.", b: false, isFatal: false} 

// <<Refresh OAuth Token>>

// Current Time
Date.now()
1381959164975 [Wed Oct 16 2013 14:32:44 GMT-0700 (Pacific Daylight Time)]

// Valid Auth Token
Object {state: "", access_token: "ya29.AHES6ZRkwocCBwxj_h7Zx2_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", token_type: "Bearer", expires_in: "3600", client_id: "XXXXXXXXXXXXXXX.apps.googleusercontent.com"…}
_aa: "1"
access_token: "ya29.AHES6ZRkwocCBwxj_h7Zx2_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
client_id: "XXXXXXXXXXXXXXX.apps.googleusercontent.com"
cookie_policy: undefined
expires_at: "1381962143"
expires_in: "3600"
g_user_cookie_policy: undefined
issued_at: "1381958543"
response_type: "token"
scope: Array[3]
state: ""
token_type: "Bearer"

// Current Value
LOCAL.data.get("t")
"0.502 Beta 3:"

// Editing Value
LOCAL.data.set("t", "0.502 Beta 4:")
Mm {a: ""0.502 Beta 3:"", Ma: Object, K: function, oa: function, J: function…}

// Edit "Worked"
LOCAL.data.get("t")
"0.502 Beta 4:"

// <<Refresh Page>>

// Current Value
LOCAL.data.get("t")
"0.502 Beta 3:"

Внесение изменений в модель реального времени работает после обновления OAuth, но изменения не сохраняются. Является ли это допустимым сценарием, поддерживаемым API? Могу ли я предоставить какую-либо дополнительную информацию, которая облегчила бы выявление проблемы?


person Grant Watters    schedule 16.10.2013    source источник
comment
Как вы обновляете токен? Вы вызываете gapi.auth.authorize() или используете какой-то другой API? Как правило, Realtime API должен повторно подключаться, даже если он простаивал в течение нескольких часов или компьютер спал. Также было бы полезно, если бы вы могли изучить панель HTTP-запросов и опубликовать любые ошибки.   -  person Brian Cairns    schedule 10.04.2014
comment
Я считаю, что у нас наконец-то есть решение этой проблемы. Мы планируем выпустить исправление на следующей неделе. Спасибо за помощь в отладке! Сложно было отследить!   -  person Brian Cairns    schedule 25.06.2014
comment
Здесь та же проблема: после нескольких часов бездействия возникает ошибка token_refresh_required, и мы не нашли способа ее повторно проверить. @BrianCairns: Было бы здорово, если бы вы могли поделиться исправлением!   -  person aemkei    schedule 04.07.2014
comment
Привет, aemkei. Когда срабатывает token_refresh_required, вы должны обработать ошибку, снова вызвав gapi.auth.authorize с немедленным: true. (Если вы используете gapi.auth.signIn для авторизации, вы, вероятно, захотите использовать его вместо этого.) Для нашего приложения мы обычно упреждающе обновляем токен авторизации до того, как он истечет, вы можете сделать это, используя поле expires_in, возвращаемое в токен.   -  person Grant Watters    schedule 06.07.2014