Khi gặp vấn đề với thông báo đẩ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 tìm hiểu kỹ về thông báo đẩy gỡ lỗi, bạn có thể gặp phải vấn đề khi gỡ lỗi chính trình chạy 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. Có một tài liệu tuyệt vời về cách gỡ lỗi trình chạy dịch vụ mà tôi khuyên bạn nên xem nếu mới bắt đầu 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à thử nghiệm thông báo đẩy trên web, mỗi giai đoạn đều có một loạt vấn đề/sự cố thường gặp:
- Gửi tin nhắn: Đảm bảo rằng bạn 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 là:
- Kiểm tra lỗi uỷ quyền: Nếu bạn nhận được thông báo lỗi uỷ quyền, hãy xem phần Vấn đề uỷ quyền.
- Các lỗi API khác: Nếu bạn nhận được phản hồi có mã trạng thái không phải 201, hãy xem phần Mã trạng thái HTTP để biết hướng dẫn về nguyên nhân gây ra vấn đề.
- Nhận thông báo: Nếu bạn có thể gửi thông báo thành công nhưng không nhận được thông báo trên trình duyệt:
- Kiểm tra các vấn đề về mã hoá: Xem phần Vấn đề về mã hoá tải trọng.
- Kiểm tra xem có vấn đề về kết nối không: Nếu vấn đề xảy ra trên Chrome, thì có thể là do kết nối. Hãy xem mục Sự cố kết nối để biết thêm thông tin.
Nếu bạn không thể gửi và nhận thông báo đẩy và các phần liên quan trong tài liệu này không giúp gỡ lỗi, thì có thể bạn đã tìm thấy lỗi trong chính cơ chế đẩy. Trong trường hợp này, hãy tham khảo phần Gửi báo cáo lỗi để gửi báo cáo lỗi chính xác kèm theo 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 tôi muốn lưu ý trước khi bắt đầu là Firefox và Dịch vụ tự động đẩy của Mozilla có thông báo lỗi rất rõ ràng. Nếu bạn gặp khó khăn và không chắc vấn đề là gì, hãy thử nghiệm 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ề 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 thông báo đẩy trên web. Đây thường là 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 một trang web.
Cách dễ nhất để hỗ trợ thông báo đẩ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à khoá của máy chủ đều 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 một loạt lỗi khác nhau, tất cả đều liên quan đến khoá máy chủ ứng dụng.
Bạn sẽ nhận được 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 đề
Authorizationtrong yêu cầu gửi đến FCM. - Khoá ứng dụng mà bạn dùng để đăng ký người dùng không khớp với khoá dùng để ký tiêu đề Authorization.
- Thời gian hết hạn không hợp lệ trong JWT, tức là thời gian hết 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 đủ sẽ 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 thử nghiệm trong Firefox để xem liệu trình duyệt này có cung cấp thêm thông tin chi tiết về vấn đề hay không.
Firefox và Mozilla AutoPush
Firefox và Mozilla AutoPush cung cấp một tập hợp thông báo lỗi thân thiện 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 của bạn.
{
"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 gian hết hạn trong JWT của bạn đã qua, bạn cũng sẽ nhận được lỗi Unauthorized kèm theo 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 đề Authorization đượ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à giá trị không mong muốn), bạn sẽ nhận được lỗi sau đây 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 các mã này liên quan đến thông báo đẩy trên web.
| Mã trạng thái | 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 về tốc độ với một dịch vụ đẩy. Phản hồi từ dịch vụ phải bao gồm tiêu đề "Retry-After" để cho biết thời gian cần chờ trước khi có thể gửi một yêu cầu khác. |
| 400 | Yêu cầu không hợp lệ. Một trong các tiêu đề của bạn không hợp lệ hoặc có định dạng không phù hợp. |
| 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 cho 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 hiện điều này bằng cách gọi `unsubscribe()` trên một `PushSubscription`. |
| 413 | Kích thước tải trọng quá lớn. Kích thước tải trọng tối thiểu mà một dịch vụ đẩy phải hỗ trợ là 4096 byte (hoặc 4kb). Bất kỳ tệp nào lớn hơn kích thước này đều có thể gây ra 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 xem thông số kỹ thuật của Giao thức thông báo đẩy trên web để xem mã trạng thái có được tham chiếu cùng với trường hợp có thể 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 được 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 mà trình duyệt nhận được.
Nếu đúng như vậ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:

Để kiểm tra xem đây có phải là vấn đề trong Chrome hay không, hãy làm như sau:
- Truy cập vào about://gcm-internals rồi nhấp vào nút "Bắt đầu ghi".

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

Nếu có vấn đề với việc 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. (Hãy chú ý đến 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:
- Công cụ Push Encryption Verifier của Peter Beverloo.
- Thông báo đẩy trên web: Trang thử nghiệm mã hoá dữ liệu của Mozilla
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ã, thì có thể trình duyệt 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 được thông báo hay không bằng cách kiểm tra "Nhật ký nhận thông báo" (sic) trong about://gcm-internals.

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

Nếu trạng thái không phải là "ĐÃ KẾT NỐI", thì bạn có thể cần phải xoá hồ sơ hiện tại và tạo một hồ sơ mới. Nếu cách này vẫn không giải quyết được vấn đề, vui lòng gửi báo cáo lỗi như đề xuất bên dưới.
Gửi báo cáo lỗi
Nếu không có cách nào ở trên giúp bạn giải quyết vấn đề và không có dấu hiệu nào cho thấy vấn đề có thể là gì, vui lòng báo cáo vấn đề về trình duyệt mà bạn đang gặp sự cố:
Đối với Chrome, bạn sẽ nêu vấn đề 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/
Để cung cấp báo cáo lỗi chính xác, bạn nên cung cấp các thông tin chi tiết sau:
- Trình duyệt bạn đã thử nghiệm (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).
- Một
PushSubscriptionmẫu minh hoạ vấn đề. - Cung cấp 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 đề).
- Hãy thêm cả 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 một ví dụ có thể tái hiện, mã nguồn hoặc trang web được lưu trữ, thì việc này thường giúp đẩy nhanh quá trình chẩn đoán và giải quyết vấn đề.
Điểm đến tiếp theo
- Tổng quan về thông báo đẩy trên web
- Cách hoạt động của thông báo đẩy
- Đăng ký cho người dùng
- Trải nghiệm người dùng về quyền
- Gửi thông báo bằng thư viện thông báo đẩy trên web
- Giao thức thông báo đẩy trên web
- Xử lý sự kiện đẩy
- Hiển thị thông báo
- Hành vi thông báo
- Các mẫu thông báo phổ biến
- Câu hỏi thường gặp về thông báo đẩy
- Các vấn đề thường gặp và cách báo cáo lỗi