5

Trong vài ngày qua, tôi đã gặp phải một số vấn đề ngày càng có vấn đề với ứng dụng thời gian thực dài chạy. Tôi đã đi qua các bước bên dưới và đoạn mã ở dưới cùng chứa thông tin gỡ lỗi bổ sung từ ứng dụng.Lỗi làm mới OAuth2 API Google Drive thời gian thực

Khi trang đầu tiên mở trang thành công, yêu cầu mã thông báo OAuth và tải tài liệu thời gian thực [A]. Sau 50 phút (10 phút trước khi mã thông báo hết hạn), nó yêu cầu lại mã thông báo OAuth mới thành công [B]. Sau khi mã thông báo đầu tiên hết hạn, kết nối hiện đang mở bị lỗi trái phép 401 và yêu cầu mã thông báo oauth mới [C]. Điều này tự nó có vẻ như là một vấn đề vì nó phải tự cập nhật để sử dụng mã thông báo hợp lệ mới từ [B].

Tuy nhiên, ứng dụng sẽ vẫn ổn định với lỗi như thế này xảy ra - vì vậy ứng dụng sẽ được xử lý bằng cách đóng và mở lại tài liệu [D] và nhận mã thông báo OAuth mới. Thật không may vào thời điểm này, API thời gian thực nằm trong một vòng lặp vô hạn nhận được lỗi cho access_token [E].

Tất cả mã thông báo OAuth được yêu cầu bằng cách sử dụng gapi.auth.authorize với cùng phạm vi và không có lệnh gọi hàm setToken. Trước đây tôi đã thử sử dụng setToken, nhưng điều đó có chính xác cùng một vấn đề.

Câu hỏi thực tế Cách chính xác để xử lý việc làm mới mã thông báo OAuth cho API thời gian thực là gì? Làm thế nào tôi có thể ngăn chặn các lỗi lặp đi lặp lại bên trong các API ổ đĩa khi đóng và mở lại một tài liệu?

[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 

Cảm ơn!

Trả lời

9

Tôi đã xem xét vấn đề của bạn và tôi nghĩ bạn chính xác về hai vấn đề chính.

  1. Mã thông báo mới không tự động được API truy cập.
  2. Đóng và mở lại tài liệu dẫn đến các lỗi "Không thể đọc thuộc tính" o định kỳ "không có giá trị".

Về vấn đề 1, chúng tôi nhận mã thông báo được làm mới bất cứ khi nào thay đổi được lưu và mỗi giây trong khi máy chủ kết nối máy khách không lành mạnh (ví dụ: sau lỗi 401). Điều này rõ ràng không bao gồm là trường hợp bạn làm mới mã thông báo sớm và không có bất kỳ thay đổi nào đối với tài liệu. Trong trường hợp này, bạn sẽ thấy 401 ngay cả khi bạn đã cập nhật mã thông báo. Tôi đang khắc phục sự cố này sẽ nhận mã thông báo được làm mới sau mỗi 30 giây trong khi kết nối vẫn tốt. Cuối cùng, chúng tôi muốn có sự kiện này được thúc đẩy để mã thông báo được chọn ngay lập tức, nhưng điều đó có phần liên quan nhiều hơn vì nó sẽ yêu cầu thay đổi đối với gapi.auth. Về vấn đề 2, dựa trên thử nghiệm của tôi, có vẻ như lỗi định kỳ là giả (nội bộ chúng tôi vẫn đang cố gắng làm mới mã thông báo cho tài liệu cũ mặc dù tài liệu đã bị đóng, đó là lý do tại sao bạn nhận được ' Không thể đọc lỗi của thuộc tính). Tôi đang làm việc trên một sửa chữa cho điều này là tốt, nhưng bạn vẫn có thể tải lại tài liệu (mặc dù bạn sẽ thấy rất nhiều lỗi rác cho tài liệu cũ). Vui lòng cho tôi biết nếu đây không phải là trường hợp và bạn thực sự không thể tải lại tài liệu.

Tôi nên lưu ý rằng bạn không cần phải tải lại tài liệu khi bạn gặp lỗi làm mới mã thông báo. Điều này được chỉ ra bởi thực tế là thuộc tính isFatal của đối tượng gapi.drive.realtime.Error được truyền tới trình xử lý lỗi của bạn là false, cho biết lỗi có thể phục hồi được. Phản hồi được đề xuất cho một lỗi token_refresh_required là làm mới mã thông báo - dịch vụ mạng sẽ tự động bắt kịp. Nếu điều đó không hiệu quả, xin vui lòng cho tôi biết vì nó là một lỗi.

- Brian (Nhà phát triển API thời gian thực)

+0

Xử lý mã token_refresh_required để chỉ cập nhật mã thông báo là đủ để khắc phục vấn đề lỗi lặp lại. Cảm ơn đã phản ứng nhanh chóng! –