无需登录 数据私有 本地保存

Web推送通知测试器 - 生成VAPID订阅

10
0
0
0

Web推送通知测试器

生成VAPID密钥对 · 测试推送订阅 · 调试Web Notification

检测中 检测中 检测中
VAPID 密钥生成器

使用 P-256 (prime256v1) 椭圆曲线生成符合规范的 VAPID 密钥对

公钥 (Public Key) · Base64URL
点击上方按钮生成密钥对...
此公钥用于前端 applicationServerKey,可安全公开
私钥 (Private Key) · Base64URL
点击上方按钮生成密钥对...
私钥应仅存储在服务器端,切勿公开或上传到前端代码中
通知权限 & 本地测试
当前权限状态: 检测中...
点击下方按钮发送测试通知
请先授予通知权限以启用测试
推送订阅测试
Service Worker: 检测中...
需要先生成VAPID密钥且有可用的Service Worker
Web Push 工作流程
1. 生成VAPID密钥
公钥+私钥
2. 用户订阅
浏览器生成订阅
3. 发送到服务器
存储订阅对象
4. 服务器推送
使用私钥签名
5. 用户收到通知
SW显示通知
常见问题与知识点

了解Web推送通知的核心概念和最佳实践

什么是 VAPID?为什么需要它?

VAPID(Voluntary Application Server Identification,自愿应用服务器标识)是Web Push协议中的一种认证机制。它允许推送服务器识别发送推送的应用服务器身份。

使用VAPID的好处:

  • 安全性:防止未授权的第三方发送推送通知
  • 身份识别:推送服务可以识别发送者,减少滥用
  • 无需API密钥:不需要为每个推送服务(如FCM)申请独立的API密钥
  • 标准化:符合IETF RFC 8292规范,跨平台兼容

VAPID使用ECDSA P-256椭圆曲线密钥对,私钥用于签名JWT,公钥用于前端订阅和验证签名。

Web Push 通知和普通 Notification API 有什么区别?
特性Web Push APINotification API
触发方式服务器端推送,即使用户未打开网页仅在前端页面打开时调用
需要Service Worker✅ 必需❌ 不需要
离线通知✅ 支持❌ 不支持
需要后端✅ 需要推送服务器❌ 纯前端
用户订阅需要用户主动订阅仅需授予权限
适用场景实时消息、离线提醒页面内即时反馈
如何生成 VAPID 密钥对?有哪些工具?

生成VAPID密钥的常用方法:

  1. 本工具:使用浏览器Web Crypto API在本地生成P-256密钥对,安全便捷
  2. Node.js:使用 web-push 库的 generateVAPIDKeys() 方法
  3. 命令行:使用 openssl ecparam -genkey -name prime256v1 生成
  4. 在线服务:部分开发者工具网站也提供生成服务(注意私钥安全)

推荐在本地或服务器端生成密钥对,确保私钥不会泄露。本工具所有计算均在浏览器本地完成,不会发送任何数据到服务器。

Service Worker 在推送通知中扮演什么角色?

Service Worker(SW)是Web Push的核心组件,它充当浏览器和推送服务器之间的中间代理

  • 接收推送:即使网页未打开,SW也能在后台接收推送消息
  • 显示通知:SW调用 self.registration.showNotification() 显示系统通知
  • 处理交互:监听 notificationclick 事件处理用户点击
  • 管理订阅:通过 PushManager 创建和管理推送订阅

SW文件必须是独立的JS文件,与网页同源,且通过HTTPS(或localhost)提供服务。

推送订阅对象中的 endpoint、p256dh、auth 分别是什么?

推送订阅对象包含三个关键字段:

  • endpoint推送服务提供商的URL(如FCM、Mozilla Push Service)。服务器向此URL发送请求以触发推送
  • keys.p256dh客户端生成的P-256公钥(Base64URL编码),用于对推送消息进行端到端加密
  • keys.auth客户端生成的认证密钥(16字节),用于验证推送消息的真实性,防止重放攻击

这三个值必须完整地发送到后端,后端使用它们和VAPID私钥来构造加密的推送请求。缺少任何一个都会导致推送失败。

各浏览器对Web Push的支持情况如何?

截至2025年,主流浏览器对Web Push的支持情况:

  • Chrome/Edge:✅ 完整支持(使用FCM作为推送服务)
  • Firefox:✅ 完整支持(使用Mozilla Push Service)
  • Safari (macOS):✅ 支持(使用Apple Push Notification Service)
  • Safari (iOS 16.4+):✅ 已支持(需将网站添加到主屏幕)
  • Opera:✅ 支持
  • Samsung Internet:✅ 支持

注意:iOS Safari的支持有特殊要求,网站必须作为PWA添加到主屏幕才能使用推送功能。

通知权限被用户拒绝后如何挽回?

当用户拒绝通知权限后,浏览器会阻止再次弹出权限请求。挽回用户的策略:

  1. 引导用户手动修改:提示用户通过浏览器设置重新启用通知(Chrome:地址栏左侧锁图标 → 通知 → 允许)
  2. 提供价值说明:在请求权限前,先展示推送通知能为用户带来的价值
  3. 二次请求时机:在用户完成关键操作后再次提示(需用户主动触发)
  4. 使用软提示:先用页面内的提示框解释为什么需要通知权限,再调用浏览器原生权限弹窗

最佳实践:永远不要在没有上下文的情况下直接请求通知权限,这会导致高拒绝率。

如何在后端使用VAPID发送Web推送通知?

后端发送Web推送的基本步骤(以Node.js为例):

// 1. 安装 web-push 库
// npm install web-push

const webpush = require('web-push');

// 2. 设置VAPID密钥
webpush.setVapidDetails(
  'mailto:your@email.com',
  vapidPublicKey,
  vapidPrivateKey
);

// 3. 发送推送
webpush.sendNotification(subscription, JSON.stringify({
  title: '新消息',
  body: '您有一条新通知',
  icon: '/icon.png'
}));

其他语言也有对应的库,如PHP的web-push-php、Python的pywebpush、Go的webpush-go等。