JWT用于从服务器

时间:2016-10-28 08:09:50

标签: ios apple-push-notifications jwt

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

现在,由于没有iOS开发经验,在iOS开发程序中没有注册,甚至没有iOS设备,我很难理解如何编写正确的JWT。也就是说,我没有得到什么

  • “从您的开发者帐户中获取的 10个字符的密钥标识符(kid)密钥”
  • “发行人(iss)注册的声明密钥,其值您的10个字符的团队ID ,从您的开发者帐户中获取”
  • “创建令牌后,您必须使用私钥对其进行签名。”

在最后一句中,我不明白这个私钥是什么。

我正在与之合作的iOS开发人员对于研究这个主题并不是非常热心,因为他们一如既往地给我提供了p12证书。所以,如果我能把它们指向正确的位置(最好是图片或工作“路径”),说“发给我这个和这个”,我的问题将有希望得到解决。如果任何开发人员的帐户中都没有这些内容,并且应该通过某个过程来获取,我恐怕我也需要这些说明(对文档或您自己的描述的工作参考将是完美的)。

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

1 个答案:

答案 0 :(得分:3)

密钥ID和密钥是从Apple Developer帐户门户获得的。该过程在Xcode help中进行了描述,可以通过搜索“配置推送通知”的帮助找到。

您在Developer门户中创建了一个新的推送通知身份验证密钥:

  1. 转到证书,标识符&配置文件,在“证书”下,选择“全部或APNs验证密钥”。

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

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

  4. 点击继续后,您将看到以下屏幕: enter image description here

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

    您可以使用它来生成令牌,该令牌是具有以下格式的JSON文档:

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

    其中kid是密钥ID,iss是团队标识符,也来自Developer门户。 iat时间为此令牌发出的,这是自Epoch以来的秒数,以UTC为单位

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

    为确保安全性,APN需要定期生成新令牌。新令牌具有在声明密钥处发布的更新,其值指示令牌生成的时间。如果令牌问题的时间戳不在最后一小时内,则APN拒绝后续推送消息,返回ExpiredProviderToken(403)错误。