Các vấn đề thường gặp và lỗi báo cáo

Khi gặp vấn đề liên quan đến tính năng đẩy trên web, bạn có thể gặp khó khăn khi gỡ lỗi hoặc tìm sự trợ giúp. Tài liệu này trình bày một số vấn đề thường gặp và những việc bạn nên làm nếu phát hiện lỗi trong Chrome hoặc Firefox.

Trước khi chúng ta đi sâu vào gỡ lỗi lệnh đẩy, có thể bạn sẽ gặp phải các vấn đề như tự gỡ lỗi trình thực thi dịch vụ, tệp không cập nhật, không đăng ký được hoặc thường chỉ là hành vi bất thường. Bạn nên xem xét một tài liệu tuyệt vời về cách gỡ lỗi trình chạy dịch vụ nếu mới làm quen với việc phát triển trình chạy dịch vụ.

Có hai giai đoạn riêng biệt cần kiểm tra khi phát triển và kiểm thử tính năng đẩy trên web, mỗi giai đoạn có một bộ vấn đề / vấn đề thường gặp riêng:

  • Gửi tin nhắn: Đảm bảo rằng quá trình gửi tin nhắn đã thành công. Bạn sẽ nhận được mã HTTP 201. Nếu bạn không phải:
  • Nhận tin nhắn: Nếu bạn gửi được tin nhắn thành công nhưng không nhận được tin nhắn trên trình duyệt:

Nếu bạn không thể gửi và nhận thông báo đẩy, đồng thời các phần liên quan trong tài liệu này không giúp gỡ lỗi vấn đề, thì có thể bạn đã phát hiện thấy lỗi trong chính cơ chế đẩy. Trong trường hợp này, hãy tham khảo phần Tăng báo cáo lỗi để gửi một báo cáo lỗi phù hợp với tất cả thông tin cần thiết nhằm đẩy nhanh quá trình sửa lỗi.

Một điều mà tôi muốn lưu ý trước khi chúng ta bắt đầu là Firefox và Dịch vụ Mozilla AutoPush có các thông báo lỗi rất hay. Nếu bạn gặp khó khăn và không chắc chắn vấn đề là gì, hãy kiểm thử trong Firefox và xem liệu bạn có nhận được thông báo lỗi hữu ích hơn hay không.

Vấn đề về việc uỷ quyền

Vấn đề về việc uỷ quyền là một trong những vấn đề phổ biến nhất mà nhà phát triển gặp phải khi bắt đầu sử dụng phương thức đẩy trên web. Đây thường là một vấn đề về cấu hình của Khoá máy chủ ứng dụng (còn gọi là khoá VAPID) của trang web.

Cách dễ nhất để hỗ trợ tính năng đẩy trong cả Firefox và Chrome là cung cấp applicationServerKey trong lệnh gọi subscribe(). Nhược điểm là mọi sự khác biệt giữa khoá của giao diện người dùng và máy chủ sẽ dẫn đến lỗi uỷ quyền.

Trên Chrome và FCM

Đối với Chrome sử dụng FCM làm dịch vụ đẩy, bạn sẽ nhận được phản hồi UnauthorizedRegistration từ FCM cho nhiều lỗi khác nhau, tất cả đều liên quan đến khoá máy chủ ứng dụng.

Bạn sẽ gặp lỗi UnauthorizedRegistration trong bất kỳ trường hợp nào sau đây:

  • Nếu bạn không xác định được tiêu đề Authorization trong yêu cầu tới FCM.
  • Khoá ứng dụng mà bạn dùng để đăng ký cho người dùng không khớp với khoá dùng để ký tiêu đề Uỷ quyền.
  • Thời gian hết hạn không hợp lệ trong JWT của bạn, tức là thời hạn vượt quá 24 giờ hoặc JWT đã hết hạn.
  • JWT không đúng định dạng hoặc có giá trị không hợp lệ.

Phản hồi lỗi đầy đủ có dạng như sau:

<html>
  <head>
    <title>UnauthorizedRegistration</title>
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <h1>UnauthorizedRegistration</h1>

    <h2>Error 400</h2>
  </body>
</html>

Nếu bạn nhận được thông báo lỗi này trong Chrome, hãy cân nhắc kiểm thử trong Firefox để xem thông báo đó có cung cấp thêm thông tin chi tiết về sự cố hay không.

Firefox và Mozilla AutoPush

Firefox và Mozilla AutoPush cung cấp một nhóm thông báo lỗi dễ hiểu cho các vấn đề về Authorization.

Bạn cũng sẽ nhận được phản hồi lỗi Unauthorized từ Mozilla AutoPush nếu tiêu đề Authorization không có trong yêu cầu đẩy.

{
  "errno": 109,
  "message": "Request did not validate missing authorization header",
  "code": 401,
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "error": "Unauthorized"
}

Nếu thời hạn trong JWT của bạn đã hết, thì bạn cũng sẽ gặp lỗi Unauthorized với thông báo giải thích rằng mã thông báo đã hết hạn.

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid bearer token: Auth expired"
}

Nếu khoá máy chủ ứng dụng khác nhau giữa thời điểm người dùng đăng ký và thời điểm tiêu đề Uỷ quyền được ký, thì lỗi Not Found sẽ được trả về:

{
  "errno": 102,
  "message": "Request did not validate invalid token",
  "code": 404,
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "error": "Not Found"
}

Cuối cùng, nếu có giá trị không hợp lệ trong JWT (ví dụ: nếu giá trị "alg" là một giá trị không mong muốn), bạn sẽ nhận được lỗi sau từ Mozilla AutoPush:

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid Authorization Header"
}

Mã trạng thái HTTP

Có nhiều vấn đề có thể dẫn đến mã phản hồi không phải 201 từ một dịch vụ đẩy. Dưới đây là danh sách mã trạng thái HTTP và ý nghĩa của mã trạng thái đó với tính năng đẩy trên web.

Mã trạng thái Nội dung mô tả
429 Quá nhiều yêu cầu. Máy chủ ứng dụng của bạn đã đạt đến giới hạn tốc độ bằng dịch vụ đẩy. Phản hồi từ dịch vụ phải bao gồm tiêu đề "Thử lại-Sau" để cho biết thời gian trước khi có thể thực hiện một yêu cầu khác.
400 Yêu cầu không hợp lệ. Một trong những tiêu đề của bạn không hợp lệ hoặc có định dạng sai.
404 Không tìm thấy. Trong trường hợp này, bạn nên xoá PushSubscription khỏi phần phụ trợ và chờ cơ hội đăng ký lại người dùng.
410 Không tồn tại. Gói thuê bao không còn hợp lệ và cần được xoá khỏi phần phụ trợ của bạn. Bạn có thể tái tạo vấn đề này bằng cách gọi phương thức "unsubscribe()" trên một "PushSubscription".
413 Kích thước tải trọng quá lớn. Tải trọng kích thước tối thiểu mà một dịch vụ đẩy phải hỗ trợ là 4096 byte (hoặc 4 kb). Bất cứ kích thước nào lớn hơn cũng có thể dẫn đến lỗi này.

Nếu mã trạng thái HTTP không có trong danh sách này và thông báo lỗi không hữu ích, hãy kiểm tra thông số kỹ thuật của Giao thức đẩy web để xem mã trạng thái có được tham chiếu cùng với trường hợp sử dụng mã trạng thái hay không.

Vấn đề về việc mã hoá tải trọng

Nếu bạn có thể kích hoạt thành công một thông báo đẩy (tức là gửi thông báo đến một dịch vụ đẩy web và nhận mã phản hồi 201), nhưng sự kiện đẩy không bao giờ kích hoạt trong trình chạy dịch vụ, thì điều này thường cho biết trình duyệt không giải mã được thông báo đã nhận được.

Trong trường hợp này, bạn sẽ thấy thông báo lỗi trong bảng điều khiển Công cụ cho nhà phát triển của Firefox như sau:

Công cụ của Firefox cho nhà phát triển có thông báo giải mã.

Để kiểm tra xem đây có phải là vấn đề trong Chrome hay không, hãy làm như sau:

  1. Truy cập vào about://gcm-internals rồi nhấp vào nút "Start recording" (Bắt đầu ghi).

Bản ghi nội bộ Chrome GCM.

  1. Kích hoạt một thông báo đẩy và xem trong "Nhật ký lỗi giải mã thư".

Nhật ký giải mã nội bộ GCM.

Nếu xảy ra vấn đề khi giải mã tải trọng, bạn sẽ thấy một lỗi tương tự như lỗi hiển thị ở trên. (Chú ý thông báo AES-GCM decryption failed trong cột chi tiết.)

Có một số công cụ có thể giúp gỡ lỗi mã hoá nếu đây là vấn đề của bạn:

Sự cố kết nối

Nếu bạn không nhận được sự kiện đẩy trong trình chạy dịch vụ và không thấy lỗi giải mã nào, thì có thể trình duyệt sẽ không kết nối được với dịch vụ đẩy.

Trong Chrome, bạn có thể kiểm tra xem trình duyệt có nhận thông báo hay không bằng cách kiểm tra "Nhận nhật ký tin nhắn" (sic) trong about://gcm-internals.

Nội bộ GCM nhận nhật ký tin nhắn.

Nếu bạn không thấy thông báo đến kịp thời, hãy đảm bảo trạng thái kết nối của trình duyệt là CONNECTED:

Trạng thái kết nối nội bộ của GCM.

Nếu hồ sơ chưa "đã kết nối", bạn có thể cần phải xoá hồ sơ hiện tại rồi tạo một hồ sơ mới. Nếu cách đó vẫn không giải quyết được vấn đề, vui lòng gửi báo cáo lỗi theo đề xuất bên dưới.

Đang tăng báo cáo lỗi

Nếu những cách trên không giúp giải quyết vấn đề của bạn và không có dấu hiệu cho thấy sự cố có thể là gì, hãy nêu vấn đề với trình duyệt mà bạn đang gặp vấn đề:

Đối với Chrome, bạn sẽ nêu vấn đề này tại đây: https://bugs.chromium.org/p/chromium/issues/list Đối với Firefox, bạn nên nêu vấn đề trên: https://bugzilla.mozilla.org/

Để tạo một báo cáo lỗi chất lượng, bạn nên cung cấp các thông tin sau:

  • Các trình duyệt bạn đã kiểm thử (ví dụ: Chrome phiên bản 50, Chrome phiên bản 51, Firefox phiên bản 50, Firefox phiên bản 51).
  • PushSubscription ví dụ minh hoạ vấn đề.
  • Đưa vào mọi yêu cầu mẫu (tức là nội dung của yêu cầu mạng đến một dịch vụ đẩy, bao gồm cả tiêu đề).
  • Đồng thời, bao gồm mọi phản hồi mẫu từ các yêu cầu mạng.

Nếu bạn có thể cung cấp ví dụ có thể mô phỏng, mã nguồn hoặc trang web được lưu trữ, thì việc chẩn đoán và giải quyết vấn đề thường tăng tốc.

Điểm đến tiếp theo

Lớp học lập trình