Kết quả cần đạt: sau khi rà soát, website chỉ xin quyền thông báo sau một hành động có chủ đích, không ép người dùng bấm Allow, không gửi nội dung giả mạo hoặc không liên quan, đồng thời có thể vô hiệu hóa đăng ký FCM khi người dùng tắt nhận tin.
Để giảm thông báo web rác, đừng bắt đầu bằng việc đổi Firebase project hoặc tạo lại khóa VAPID. Hãy kiểm tra theo thứ tự: luồng xin quyền → trạng thái quyền trong Chrome → đăng ký FCM → nội dung và tần suất gửi → báo cáo lạm dụng. FCM cung cấp cơ chế gửi tin cho web, nhưng không thay thế trách nhiệm của website trong việc xin quyền và chọn nội dung phù hợp (theo firebase.google.com).
Phân biệt bốn lớp gây ra thông báo web rác
| Lớp cần kiểm tra | Vấn đề thường gặp | Dấu hiệu xác minh |
|---|---|---|
| Giao diện xin quyền | Hiển thị hộp thoại giả giống nút hệ thống hoặc buộc người dùng cho phép để xem nội dung. | Người dùng chưa chủ động yêu cầu nhưng đã thấy lời mời bật thông báo. |
| Quyền của trình duyệt | Domain vẫn được phép gửi thông báo dù người dùng không còn muốn nhận. | Chrome hiển thị domain trong danh sách được phép gửi thông báo. |
| Đăng ký FCM | Token hoặc Firebase Installation ID cũ vẫn còn được lưu và tiếp tục nhận tin. | Tài khoản hoặc trình duyệt đã tắt nhận tin nhưng bản ghi đăng ký vẫn hoạt động. |
| Nội dung gửi | Tiêu đề giả cảnh báo hệ thống, tin nhắn giống thông báo trò chuyện, liên kết lạ hoặc gửi quá dày. | Payload không giải thích rõ lý do gửi và đích đến. |
Chrome và Google Web Tools xem các yêu cầu quyền gây hiểu lầm, thông báo giả mạo, thông báo lừa đảo hoặc quảng bá phần mềm độc hại là các dạng abusive notifications. Vì vậy, “đã có người bấm Allow” không đồng nghĩa với “đăng ký đó hợp lệ” (theo support.google.com).
Kiểm tra luồng xin quyền trước khi kiểm tra FCM
Loại bỏ yêu cầu quyền khi trang vừa tải
Không gọi Notification.requestPermission() trong mã chạy ngay khi trang mở, trong DOMContentLoaded, trong bộ hẹn giờ tự động hoặc sau một lần chuyển hướng mà người dùng không chủ động yêu cầu.
Chrome Lighthouse đánh dấu việc xin quyền thông báo ngay khi tải trang là thực hành không tốt. Cách an toàn hơn là giải thích trước người dùng sẽ nhận loại tin nào, sau đó chỉ mở hộp thoại quyền khi họ nhấn nút đăng ký rõ ràng (theo developer.chrome.com).
Đoạn mã dưới đây chạy ở JavaScript phía trình duyệt. Nút #enable-notifications phải tồn tại trong HTML của website. Hàm registerFcmSubscription() là điểm tích hợp với Firebase của bạn; hãy thay bằng hàm thật của dự án, không sao chép nguyên tên hàm nếu dự án không có hàm đó.
const enableButton = document.querySelector('#enable-notifications');
if (!enableButton) {
throw new Error('Không tìm thấy nút #enable-notifications');
}
enableButton.addEventListener('click', async () => {
if (!('Notification' in window)) {
showMessage('Trình duyệt này không hỗ trợ thông báo web.');
return;
}
try {
const permission = await Notification.requestPermission();
if (permission === 'granted') {
// Thay bằng hàm đăng ký FCM thật của ứng dụng.
await registerFcmSubscription();
showMessage('Đã bật thông báo. Bạn có thể tắt bất cứ lúc nào.');
} else {
showMessage('Bạn chưa bật thông báo; website vẫn hoạt động bình thường.');
}
} catch (error) {
console.error('Không thể xin quyền thông báo:', error);
showMessage('Không thể bật thông báo lúc này.');
}
});
Sau khi thay hàm tích hợp, mở website bằng hồ sơ Chrome thử nghiệm, nhấn nút và kiểm tra hộp thoại quyền chỉ xuất hiện sau cú nhấn. Nếu người dùng từ chối, không tạo bản ghi đăng ký FCM.
Thiết kế lời mời để người dùng không bấm nhầm
- Nói rõ người dùng sẽ nhận gì, chẳng hạn “cảnh báo đơn hàng đã giao” hoặc “tin nhắn mới”, thay vì chỉ viết “Bấm Allow để tiếp tục”.
- Không khóa nội dung, video, kết quả tìm kiếm hay nút đóng phía sau yêu cầu cho phép thông báo.
- Không dùng hình ảnh hoặc lời thoại mô phỏng hộp thoại hệ thống, cảnh báo virus, tin nhắn riêng tư hay yêu cầu cập nhật trình duyệt.
- Cho phép chọn “Để sau” và vẫn sử dụng website ở trạng thái bình thường.
- Hiển thị nút tắt hoặc quản lý thông báo trong tài khoản, thay vì buộc người dùng phải tự tìm trong cài đặt trình duyệt.
Nếu website dùng một lớp giao diện trung gian trước hộp thoại Chrome, lớp đó phải giải thích trung thực và không tạo áp lực. Một lời mời giả mạo có thể khiến người dùng đăng ký ngoài ý muốn và là dấu hiệu thường gặp của web notification abuse.
Kiểm tra quyền thông báo trên Chrome
Trên máy tính, mở Chrome rồi vào Cài đặt → Quyền riêng tư và bảo mật → Cài đặt trang web → Thông báo. Kiểm tra domain của website trong danh sách được phép, bị chặn hoặc các mục Chrome đang nhắc người dùng xem xét.
Chrome có thể tự gỡ quyền thông báo của những website mà Safe Browsing xác định là đang đánh lừa người dùng cấp quyền. Chrome cũng có thể hạn chế lời nhắc hoặc yêu cầu website xin quyền lại. Vì vậy, quyền bị thay đổi không nhất thiết chứng minh FCM hỏng; trước hết hãy kiểm tra trải nghiệm xin quyền và trạng thái an toàn của domain (theo support.google.com).
Để kiểm tra thực tế, hãy dùng một hồ sơ Chrome sạch hoặc xóa quyền của domain trong phần cài đặt, sau đó thực hiện các kịch bản sau:
- Mở trang lần đầu: không được tự động bật hộp thoại quyền.
- Đọc lời giải thích và không nhấn nút đăng ký: không được xuất hiện hộp thoại quyền của trình duyệt.
- Nhấn nút đăng ký: Chrome mới hiển thị yêu cầu quyền.
- Chọn “Không cho phép”: nội dung chính của website vẫn dùng được.
- Chọn “Cho phép”: chỉ nhận đúng loại thông báo đã mô tả.
- Thu hồi quyền trong Chrome: hệ thống không được tiếp tục coi trình duyệt là thuê bao đang hoạt động.
Chrome có tùy chọn “Use quieter messaging” để giảm các lời nhắc gây gián đoạn. Đây là cơ chế của trình duyệt, không phải cách sửa gốc cho một website liên tục xin quyền hoặc gửi nội dung kém liên quan.
Rà soát Firebase Cloud Messaging và đăng ký thuê bao
FCM trên web cần quyền thông báo, service worker và cấu hình HTTPS. Sau khi được cấp quyền, ứng dụng mới nên đăng ký trình duyệt, lưu định danh cần thiết ở máy chủ và dùng nó để gửi tin đúng đối tượng. Trong hệ thống của bạn, hãy lập bảng đối chiếu tối thiểu gồm:
| Trường | Mục đích | Điều kiện cần xử lý |
|---|---|---|
| User hoặc account ID | Biết đăng ký thuộc người dùng nào. | Xóa hoặc vô hiệu hóa khi tài khoản đăng xuất, hủy đăng ký hoặc bị xóa. |
| Origin hoặc domain | Tránh dùng nhầm đăng ký từ website khác. | Từ chối bản ghi không khớp domain dự kiến. |
| FCM token hoặc Firebase Installation ID | Định tuyến thông báo tới đúng phiên bản trình duyệt. | Cập nhật khi giá trị thay đổi; loại bỏ khi FCM trả lỗi token không hợp lệ. |
| Consent state | Ghi nhận người dùng đã bật, tắt hoặc chưa quyết định. | Không suy đoán “đã đăng ký” chỉ vì từng có token. |
| Topic hoặc nhóm nhận tin | Giới hạn loại nội dung được gửi. | Hủy đăng ký nhóm khi người dùng bỏ chọn. |
Đừng gửi một thông báo quảng bá cho toàn bộ token chỉ vì chúng còn tồn tại trong cơ sở dữ liệu. Mỗi chiến dịch nên có tiêu chí đối tượng, mục đích, thời hạn và cơ chế loại trừ người đã tắt nhận tin. Firebase cũng khuyến nghị quản lý định danh cài đặt và không trộn lẫn các cách quản lý đăng ký cũ với cách mới trong cùng một luồng.
Thu hồi đăng ký khi người dùng tắt thông báo
Nút “Tắt thông báo” nên thực hiện cả hai việc: cập nhật trạng thái đồng ý ở máy chủ và xóa hoặc vô hiệu hóa đăng ký FCM tương ứng. Nếu chỉ ẩn nút trên giao diện, máy chủ vẫn có thể gửi tin tới token cũ.
async function disableNotifications() {
const response = await fetch('/api/notification-subscription', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
credentials: 'include'
});
if (!response.ok) {
throw new Error(`Không thể tắt đăng ký: HTTP ${response.status}`);
}
showMessage('Đã tắt đăng ký thông báo trên tài khoản này.');
}
Đoạn mã chạy ở trình duyệt và /api/notification-subscription chỉ là đường dẫn ví dụ; hãy thay bằng API thật của ứng dụng. API máy chủ phải xác thực người dùng và chỉ vô hiệu hóa đăng ký thuộc tài khoản đó. Không đưa khóa máy chủ FCM, khóa riêng VAPID hoặc thông tin xác thực quản trị vào JavaScript gửi cho trình duyệt.
Kiểm tra nội dung, liên kết và tần suất thông báo

Mỗi thông báo nên trả lời được ba câu hỏi: Ai gửi? Vì sao tôi nhận? Nhấn vào sẽ đi đâu? Nếu người dùng không thể trả lời nhanh ba câu này, thông báo có nguy cơ bị xem là rác dù kỹ thuật gửi hoàn toàn đúng.
- Tiêu đề: mô tả sự kiện cụ thể, chẳng hạn “Đơn hàng đã được giao”, không dùng “Cảnh báo khẩn cấp” nếu không có sự cố thực sự.
- Nội dung: ngắn, chính xác, không tạo cảm giác mất mát giả tạo hoặc yêu cầu nhập mật khẩu ngoài ngữ cảnh.
- Biểu tượng: dùng biểu tượng thương hiệu hoặc sản phẩm dễ nhận biết, không dùng hình ảnh giống cảnh báo hệ điều hành.
- Liên kết: dùng HTTPS, trỏ tới đúng trang liên quan và không chuyển tiếp qua chuỗi domain không rõ nguồn gốc.
- Tần suất: gộp các sự kiện tương tự, đặt giới hạn theo người dùng và ngừng gửi khi không còn lý do hợp lệ.
Với thông báo nền trên web, FCM hỗ trợ liên kết đưa người dùng về ứng dụng; liên kết này cần là URL HTTPS. Tài liệu Firebase cũng khuyến nghị tiêu đề phải nêu chính xác bản chất thông báo và không lặp tên website hoặc domain trong tiêu đề khi trình duyệt đã hiển thị domain đó (theo firebase.google.com).
Kiểm tra Chrome Abusive Notifications Report
Nếu bạn là chủ sở hữu hoặc người dùng được cấp quyền trong Google Search Console, hãy mở Abusive Notifications Report của domain. Báo cáo có thể hiển thị ví dụ về trang, loại vi phạm và cách trải nghiệm đó xuất hiện. Báo cáo chỉ xem một mẫu URL, vì vậy sửa đúng một trang chưa đủ để kết luận toàn domain đã an toàn.
- Ghi lại URL, mẫu giao diện và loại vấn đề trong báo cáo.
- Tìm nguồn tạo trải nghiệm: mã của website, trình quản lý thẻ, plugin, mạng quảng cáo hoặc thư viện bên thứ ba.
- Loại bỏ yêu cầu quyền gây hiểu lầm và mọi thông báo giả, lừa đảo hoặc liên kết tới phần mềm không mong muốn.
- Rà soát các template, landing page, subdomain và script dùng chung.
- Kiểm tra lại bằng hồ sơ trình duyệt sạch và các trạng thái cho phép, từ chối, thu hồi quyền.
- Gửi yêu cầu xem xét lại khi đã xử lý toàn bộ nhóm vấn đề.
Nếu trạng thái báo cáo là Failing, Chrome có thể chặn tất cả thông báo và cả yêu cầu xin quyền của website. Google cho biết báo cáo dựa trên mẫu URL và cần sửa cả các vi phạm được liệt kê lẫn những vi phạm tương tự còn sót lại; sau khi trạng thái thay đổi, hành vi có thể cần thời gian để phản ánh đầy đủ trên Chrome (theo support.google.com).
Cây chẩn đoán nhanh khi vẫn còn thông báo rác
- Không thấy hộp thoại xin quyền: kiểm tra quyền hiện tại của domain, chế độ thông báo yên lặng, HTTPS và chính sách quản trị trình duyệt.
- Người dùng đã từ chối nhưng vẫn nhận tin: tìm token cũ, nhiều domain hoặc nhiều service worker cùng ghi nhận một thiết bị; vô hiệu hóa bản ghi ở máy chủ.
- Chỉ một số người nhận tin sai: kiểm tra segment, topic, cache cấu hình và việc tài khoản đăng xuất có xóa đăng ký hay không.
- Chrome gỡ quyền hoặc chặn yêu cầu: kiểm tra Abusive Notifications Report, các lớp giao diện giả, script bên thứ ba và nội dung liên kết.
- Nhận nhiều bản giống nhau: kiểm tra việc gửi trùng từ cả notification message, data message và service worker; bảo đảm chỉ một luồng chịu trách nhiệm hiển thị.
- Đã xóa service worker nhưng vẫn nhận tin: kiểm tra permission của domain, các bản ghi FCM ở máy chủ và các trình duyệt hoặc subdomain khác; xóa một service worker không tự động thu hồi mọi quyền của người dùng.
Checklist nghiệm thu trước khi bật rộng
- Trang mở lần đầu không tự gọi yêu cầu quyền.
- Lời giải thích nêu rõ loại thông báo và tần suất dự kiến.
- Người dùng có thể bỏ qua mà vẫn dùng được nội dung chính.
- FCM chỉ được đăng ký sau khi trạng thái quyền là
granted. - Token hoặc Firebase Installation ID được gắn đúng người dùng, domain và nhóm nội dung.
- Token lỗi, cũ hoặc đã hủy được vô hiệu hóa ở máy chủ.
- Nút tắt thông báo cập nhật cả trạng thái đồng ý và bản ghi gửi.
- Thông báo không giả làm cảnh báo hệ thống, tin nhắn riêng tư hoặc cảnh báo bảo mật.
- Liên kết trong thông báo dùng HTTPS và đi tới đúng ngữ cảnh.
- Đã kiểm tra báo cáo Chrome Abusive Notifications sau khi triển khai.
Nếu đang sửa một hệ thống cũ, hãy triển khai theo đường tối thiểu: tắt yêu cầu quyền tự động → thêm nút đăng ký rõ ràng → dừng gửi cho token không xác minh được → rà soát payload → kiểm tra báo cáo của Google. Sau đó mới tối ưu phân nhóm và tần suất. Cách này giúp phân biệt lỗi về quyền, dữ liệu đăng ký và nội dung thay vì thay đổi tất cả cùng lúc.
Nguồn tham khảo
- Abusive notifications – Web Tools Help
- Introduction to the Abusive Notifications Report
- Chrome enforcement – Web Tools Help
- Manage Chrome safety and security – Computer
- Requests the notification permission on page load
- Get started with Firebase Cloud Messaging in Web apps
- Receive messages in Web apps

