如何验证APNs令牌认证中.p8文件、KeyId、TeamId与BundleId组合有效性
APNs .p8推送凭证组合有效性校验方案
完全可以在正式推送前完成整套凭证的合法性校验,不需要等到实际推送时才发现凭证失效导致消息投递失败。
前置基础校验
- 首先检查文件和字段格式合法性:
- 合法的
.p8APNs密钥文件为纯文本格式,固定以-----BEGIN PRIVATE KEY-----开头,以-----END PRIVATE KEY-----结尾,文件内不能存在乱码、错误换行、多余空格 - KeyId、TeamId均为10位长度的大小写混合字符串,需和Apple Developer后台对应信息完全一致
- BundleId需和密钥关联的App ID完全匹配,注意大小写、前后缀不能有偏差
- 合法的
有效性连通性校验(100%准确)
这套方法不会对真实用户发送推送,仅通过APNs接口的返回结果判断凭证合法性:
- 按照APNs官方要求用持有的
.p8私钥生成ES256算法签名的JWT鉴权token:- JWT头部固定携带
"alg": "ES256"、"kid": "你的KeyId"字段 - JWT载荷携带
"iss": "你的TeamId"、"iat": 当前Unix时间戳字段
- JWT头部固定携带
- 向对应环境的APNs接口发起测试请求:
- 开发沙盒环境请求地址:
api.sandbox.push.apple.com - 生产环境请求地址:
api.push.apple.com - 请求头携带
authorization: bearer <你生成的JWT>、apns-topic: 你的BundleId - 请求路径填
/3/device/0000000000000000000000000000000000000000000000000000000000000000(填一个全0的无效device token即可,不会触发真实推送)
- 开发沙盒环境请求地址:
- 根据接口返回状态码判断凭证有效性:
- 如果返回
403 Forbidden且错误为InvalidProviderToken:说明.p8私钥、KeyId、TeamId三者不匹配,或私钥内容损坏、JWT签名错误 - 如果返回
403 Forbidden且错误为BadTopic:说明传入的BundleId和当前密钥有权限推送的App ID不匹配 - 如果返回
410 Gone/400 BadRequest且错误为BadDeviceToken:说明整套凭证完全合法有效,鉴权已经通过,仅因为测试用的device token是无效值才返回错误,已经达到校验目的
- 如果返回
注意事项
.p8格式的APNs密钥本身没有有效期,只要你不在Apple Developer后台主动撤销对应KeyId的密钥,且私钥文件没有损坏,凭证就会一直有效,不存在旧版p12证书到期失效的问题- 校验时注意环境匹配,开发密钥对应沙盒环境、生产密钥对应线上环境,环境不匹配也会返回鉴权失败
- 用于请求的JWT有效期为签发后1小时,超过时间的JWT会被接口拒绝,不属于凭证本身无效,重新生成新的JWT重试即可
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

