Appearance
本服务端涉及四种"凭证",分别服务于不同的链路,容易混淆,这里统一说明它们是什么、由谁生成、用在哪里。
1. device_token(iOS 设备令牌)
- 是什么:Apple APNs 分配给每一台 iOS 设备 + 每一个 App 的唯一推送地址。Bark App 注册 APNs 成功后,系统会返回一段 64 字节的十六进制字符串(约 128 个字符),这就是 device_token。
- 谁生成:iOS 系统(通过 APNs 注册流程),服务端不生成、也无法伪造。
- 用在哪:Bark App 启动后调用
POST /register(或兼容的GET /register?devicetoken=...)把 device_token 上报给服务端;服务端存储它,推送时把它作为 APNs 投递目标。 - 怎么查看:在 Bark App 内查看(通常位于"设置 → 更多/设备信息",或 App 展示的推送 URL 里)。
- 注意:device_token 会因重装 App、恢复系统等原因失效。服务端在推送返回
410 BadDeviceToken时会自动清除该设备的记录,需要重新注册。
2. harmony_token(鸿蒙设备令牌)
- 是什么:华为 Push Kit 分配给每一台 HarmonyOS 设备 + 每一个 App 的唯一推送地址。鸿蒙应用集成 Push Kit 后,系统会返回一段字符串作为推送 token。
- 谁生成:HarmonyOS 系统(通过华为 Push Kit 注册流程),服务端不生成。
- 用在哪:鸿蒙 App 启动后调用
POST /register把device_token和platform: harmony上报给服务端;服务端根据 platform 字段自动选择华为通道推送。 - 注册方式:
sh
# 注册鸿蒙设备
curl -X POST http://<host>:18080/register \
-H 'Content-Type: application/json' \
-d '{"device_key":"my-harmony-device","device_token":"<harmony_push_token>","platform":"harmony"}'- 注意:harmony_token 失效时,服务端会清除该设备的记录,需要重新注册。
3. device_key(设备 key,即 Bark URL 里的那段)
- 是什么:设备的短标识,注册时由用户自定义或由服务端生成。推送时用它定位 device_token,不需要在每次推送时携带完整的 token。
- 谁生成:
- 用户注册时指定
key(如mydemo):服务端原样保存。 - 用户不指定:服务端用
shortuuid生成一个随机 key(database/bbolt.go、database/mysql.go中的SaveDeviceTokenByKey)。
- 用户注册时指定
- 用在哪:推送 URL 的路径段与
device_key参数,例如GET /mydemo/标题/内容或POST /push的 JSON 里"device_key": "mydemo";也是旧版兼容推送路由/:device_key的凭证。注册成功响应会返回key、device_key和platform(新增)字段。 - 多平台共存:同一个
device_key可以同时绑定 iOS 与鸿蒙设备——iPhone 用platform=ios注册、鸿蒙手机用platform=harmony注册到同一个 key,数据库按(key, platform)唯一约束并存。推送时服务端默认扇出到该 key 下所有有效平台(iPhone 和鸿蒙手机同时收到),任一平台投递成功即返回 200;若只想推某一端,在推送请求体带"platform": "ios"或"harmony"收窄到指定平台。注意:失效 token 清理是按平台定向的(ClearDeviceTokenByKeyAndPlatform),不会因为一端失效而连累另一端。 - ⚠️ 安全提示:device_key 就是推送凭证——任何人拿到你的 Bark URL(含 key)就能向你的设备推送。不要在公开渠道晒 Bark 推送 URL。它是"设备级"凭证,与 client token 无关。
4. client token(gotify 兼容接口令牌)
- 是什么:访问 Gotify 兼容监控接口(设备级
/:device_key/message、/:device_key/stream)的令牌。所有推送(包括 iOS 和 HarmonyOS)都会进入这个监控流。 - 谁生成:两种方式:
- 推荐——预置:启动时设置环境变量
BARK_SERVER_GOTIFY_CLIENT_TOKEN或参数--gotify-client-token。服务端只保存 SHA-256 哈希,不落明文;token 本身由你指定(比如用openssl rand -base64 32生成)。 - 自动生成:未设置时,服务端用
crypto/rand生成 32 字节随机数并做 base64url 编码(43 字符),首次启动时在日志打印一次(internal/gotifycompat/token.go、service.go)。明文会以 0600 权限存进<data>/gotify.db以保持重启稳定。
- 推荐——预置:启动时设置环境变量
- 用在哪:hotify-bridge 的
bridge_config.yaml里gotify_token(或环境变量GOTIFY_CLIENT_TOKEN)。 - 重启后怎么拿回自动生成的 token:出于防日志泄漏考虑,自动生成的 token 只在生成那一刻打印一次,重启后不再打印。此时日志会提示 token 已持久化在
<data>/gotify.db。若丢失,二选一:- 用环境变量/参数固定一个 token(推荐);
- 停止服务后删除
<data>/gotify.db再启动,重新生成(会同时清空监控消息历史)。 - 例外:若数据目录不可用,服务退化为内存存储,每次启动都会重新生成并打印一次 token,但重启后即失效——这种部署应使用预置 token。
- ⚠️ 安全提示:client token 能读取全部监控消息并订阅实时流,泄露后请用预置方式更换(operator token 生效时旧的明文记录会被自动清除)。
5. 华为 Push Kit 服务账号凭证
- 是什么:服务端调用华为 Push Kit API 时使用的鉴权凭证。采用"服务账号 JWT"方式(HarmonyOS NEXT 推荐)。
- 发送所需四个字段:
keyID、subAccount、projectID、privateKey。如需使用鸿蒙通知删除(delete),还需配置应用级clientID(普通发送不需要)。 - 谁生成:华为开发者联盟控制台(
https://developer.huawei.com/consumer/cn/console/api/myApi)。 - 配置方式:将凭证填入
harmony/harmony_certs.go文件。 - ⚠️ 安全提示:禁止将真实凭证提交到公开仓库。
privateKey是 RSA 私钥,一旦泄露可被伪造 JWT 发送任意推送。
凭证与接口一览
| 凭证 | 用途 | 谁生成 | 认证哪些接口 |
|---|---|---|---|
| device_token | APNs 投递目标 | iOS 系统 | /register 上报,推送时由服务端内部使用 |
| harmony_token | 华为 Push Kit 投递目标 | HarmonyOS 系统 | /register 上报,推送时由服务端内部使用 |
| device_key | 定位设备、推送凭证 | 用户或服务端(shortuuid) | /push、/:device_key 兼容推送、/mcp、/mcp/:device_key |
| client token | 监控接口访问 | 用户预置或服务端自动生成 | 设备级 /:device_key/message、/:device_key/stream(/:device_key/version 无需认证) |
| 服务账号密钥 | 华为 API 鉴权 | 华为开发者联盟 | 服务端内部使用,用于签名 JWT |
补充说明(均属上游设计,非本 fork 引入):
- MCP 接口与 push 等价,以 device_key 为凭证,无独立认证。开启 Basic Auth(
--user/--password)后/mcp、/push会被保护(白名单只放行/ping、/register、/healthz、/info+ 设备级/:device_key/version、/:device_key/message、/:device_key/stream;其中设备级监控接口走 gotify token 鉴权,/info无凭据返回基础信息,带有效 Basic Auth 才返回设备数)。 - Basic Auth 配置注意:
--user有值而--password为空时,除白名单外所有请求都会被拒绝。 - 服务端内置了 Bark App 的 APNs p8 私钥(
apns/apns_certs.go),这是"服务端代发"架构——任何运行本服务端的人都能以 Bark App 名义发推送,请只在你信任的主机上部署。 - 服务端鸿蒙推送使用的华为服务账号密钥需要用户自行配置(
harmony/harmony_certs.go),不会随代码仓库分发。