用于从服务器发送 iOS 推送消息的 JWT

JWT for sending iOS push messages from the server

我目前正在开发 server-side 支持发送 iOS 推送消息(如果相关,服务器在 Java 中)。 Apple 开发人员文档 "Communicating with APNs" 声称,如果使用 HTTP/2 协议,则可以使用证书或刚刚插入 header 的 JWT 令牌。同样,据我所知,证书应该每年手动更新(对我来说似乎 error-prone),而 JWT 的所有部分都可以无限期地自动重新生成(或不?)。如果是这样的话,我肯定想尝试使用 JWT。

现在,iOS 开发经验为零,没有在 iOS 开发程序中注册,甚至没有 iOS 设备,我很难理解如何准确地编造正确的智威汤逊。即,我不明白什么是

最后一句我没看懂这个私钥是什么

iOS 与我一起工作的开发人员对研究这个主题不是很热心,他们像过去一样给了我 p12 证书。因此,如果我可以将它们指向正确的位置(最好是图片或工作 "paths")说 "send me this and this",我的问题有望得到解决。如果其中任何一个在任何开发人员的帐户中都不容易获得并且应该通过某种过程获得,恐怕我也需要这些说明(对文档的工作参考或您自己的描述将是完美的)。

如果您能确认我对 JWT 的一般假设并向我澄清遗漏的细节,我将不胜感激。

Key ID和Key是从苹果开发者账号入口获取的。该过程在 Xcode help 中进行了描述,可以通过搜索“配置推送通知”的帮助找到。

您在开发人员门户中创建新的推送通知身份验证密钥:

  1. 转到证书、标识符和配置文件,然后在证书下,select全部或 APNs 授权密钥。

  2. 单击右上角的添加按钮 (+)。

  3. 在生产下,select“Apple 推送通知身份验证密钥(沙盒和生产)”复选框,然后单击继续。

单击继续后,您将看到以下屏幕:

密钥 ID 是文档中提到的 KID,当您单击 下载 时,您将获得与此密钥 ID 关联的私钥。

您可以使用它来生成令牌,这是一个 JSON 文件,格式如下:

{
    "alg": "ES256",
    "kid": "ABC123DEFG"
}
{
    "iss": "DEF123GHIJ",
    "iat": 1437179036
}

其中 kid 是密钥 ID,iss 是团队标识符,同样来自开发人员门户。 iat 是此令牌的发行时间,这是自 Epoch 以来的秒数,UTC

创建令牌后,您必须使用生成 kid 时从门户网站下载的私钥对其进行签名。然后,您必须使用带有 P-256 曲线和 SHA-256 哈希算法的椭圆曲线数字签名算法 (ECDSA) 来加密令牌。

为确保安全,APNs 需要定期生成新的令牌。一个新令牌有一个 updated issued at claim 键,其值表示令牌生成的时间。如果令牌发布的时间戳不在最后一个小时内,APNs 将拒绝后续推送消息,并返回 ExpiredProviderToken (403) 错误。