使用Python VAPID发送Web Push时遇“缺失aud声明”错误求助
解决pywebpush中VAPID声明缺失aud字段的问题
核心问题分析
你遇到的ValueError: Missing 'aud' from claims错误,看似已手动设置aud,但实际大概率是以下原因导致:
- 手动指定的aud与推送服务的endpoint域名不匹配
- 私钥格式错误导致VAPID签名过程异常,aud字段未被正确注入
- 手动设置的aud格式不符合规范(比如多余的末尾斜杠)
解决方案步骤
1. 移除手动设置的aud,让pywebpush自动生成
aud字段的正确值是推送服务endpoint的origin(比如FCM的https://fcm.googleapis.com、Mozilla推送服务的https://updates.push.services.mozilla.com),而非你自己的网站域名。pywebpush可以自动从subscription_info的endpoint中提取正确的aud,无需手动指定。
修改后的代码:
from pywebpush import webpush, WebPushException from py_vapid import Vapid # 替换为你的实际VAPID私钥 vapid_private_key = "KE0RL_B2SY1AVcpHRWgTzC68or6cLC4RZaHmkM4ZsLk" def send_push_notification(subscription_info, data): vapid_claims = { "sub": "mailto:vadimshiba@duck.com" } try: # 使用py_vapid生成合规的VAPID签名头 vapid = Vapid.from_raw_key(vapid_private_key.encode('utf-8'), vapid_claims["sub"]) headers = vapid.sign(subscription_info['endpoint']) response = webpush( subscription_info=subscription_info, data=data, headers=headers ) print("Push sent successfully: ", response) return True except WebPushException as ex: print("Web push failure: ", repr(ex)) return False
2. 确保VAPID私钥格式正确
- 如果私钥是通过
vapid --gen命令生成的,它会是PEM格式(包含-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----),直接使用即可。 - 如果是URL-safe base64格式(如你当前的字符串),使用
Vapid.from_raw_key方法加载是正确方式。
3. 验证subscription_info的完整性
确保前端传递的subscription_info包含完整合法的字段:
# 示例合规的subscription_info结构 subscription_info = { "endpoint": "https://fcm.googleapis.com/fcm/send/xxxxxx", "keys": { "p256dh": "base64编码的公钥", "auth": "base64编码的密钥" } }
4. 额外排查点
- 升级依赖到最新版本:
pip install --upgrade pywebpush py_vapid - 检查推送服务的endpoint是否合法,无拼写错误
内容的提问来源于stack exchange,提问作者John Snow
相关产品推荐
相关产品推荐

