指导如何为 APNS 实际加密 JSON 令牌

Posted

技术标签:

【中文标题】指导如何为 APNS 实际加密 JSON 令牌【英文标题】:Guide how to actually encrypt JSON Token for APNS 【发布时间】:2019-08-05 11:08:09 【问题描述】:

希望有人能帮我解决这个问题……因为我花了很多时间在上面,但仍然没有工作。

简而言之,我想为我的 Xamarin.Forms 应用使用 Azure 通知中心。

它希望这些信息起作用:

这一切都很好,我把它们都控制住了,期待令牌。

好的,所以我关注了有关该主题的 Microsoft 文档: https://docs.microsoft.com/en-us/azure/notification-hubs/notification-hubs-push-notification-http2-token-authentification

我继续跟进并控制了我认为的事情,直到我得到: "Authentication token"

这里说:

身份验证令牌可以在您为应用程序生成令牌后下载。有关如何生成此令牌的详细信息,请参阅 Apple 的开发者文档。

好像没什么大不了的,然后它链接到this page,这应该对我有帮助。通读它,点击链接等阅读内容。

我最终进入了这个页面:Establishing a Token-Based Connection to APNs

疯狂和困惑真的让我开始了,因为它接着说,就像这是世界上最常见的事情:

使用您的身份验证令牌签名密钥和指定算法加密生成的 JSON 数据

除了指向 jwt.io 工具的链接之外,它并没有真正解释太多。 好吧,如果我能让这个工具工作,那就太好了……

从表面上看,这很容易,因为文档解释了在哪里放什么,所以我这样做了:

所以“标题”和“有效负载”已填写,我认为它是正确的 - 但是,在底部我显然需要输入一些密钥才能在另一端正确解密......问题是我在这里输入什么?

当我在 Apple Developer 门户中创建我的密钥时,我下载了 .p8 文件,我可以看到该文件包含我的 PRIVATE 密钥...但我有 2 个问题。

将其放入此 jwt.io 工具,立即导致“无效签名”,我不知道将什么放入“公钥”部分。

那么,我做错了什么?

在此先感谢,真的希望有人能帮助我,因为我开始为这个开发中的“微小”步骤而疯狂,现在已经花费了太长时间。

【问题讨论】:

【参考方案1】:

在 jwt.io 的底部,您可以使用一些库来加密服务器上的令牌。比如这个php库:https://github.com/lcobucci/jwt/blob/3.3/README.md

关于公钥。我认为 KeyID 是 APNs 用来验证的公钥。您只需要私钥即可生成令牌。在这个 php 示例中是这样的:

$token = (new Builder())->issuedBy('http://example.com') // Configures the issuer (iss claim)
                        ->permittedFor('http://example.org') // Configures the audience (aud claim)
                        ->identifiedBy('4f1g23a12aa', true) // Configures the id (jti claim), replicating as a header item
                        ->issuedAt($time) // Configures the time that the token was issue (iat claim)
                        ->canOnlyBeUsedAfter($time + 60) // Configures the time that the token can be used (nbf claim)
                        ->expiresAt($time + 3600) // Configures the expiration time of the token (exp claim)
                        ->withClaim('uid', 1) // Configures a new claim, called "uid"
                        ->getToken($signer,  $privateKey); // Retrieves the generated token

【讨论】:

【参考方案2】:

只给偶然发现这个问题的人。

Azure 通知中心设置中的令牌字段是私钥,您可以在从通用 APN 的 Apple 开发人员帐户下载的 .p8 文件中找到它。

至于 JWT 加密,当你直接向苹果的 apn 服务器发送请求时,你需要它。您将需要通过加密标头和有效负载来发送不记名令牌(规范在苹果的网站上)。加密由加密库完成,使用算法 ES256(APN 仅支持一种),签名密钥是我们上面提到的令牌,即 .p8 中的私钥。这会创建一个 JWT,您将其包含在您的 Authorization 标头中,用于向 APN 服务器发出请求

【讨论】:

以上是关于指导如何为 APNS 实际加密 JSON 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何为 adHoc 用户测试 APNS?

如何为XMPP android的聊天节实现OMEMO加密

刷新令牌如何为 jwt 添加安全性?

验证使用 JSON Web 加密 (JWE) 加密的安全令牌的颁发者?

APNs、FCM 或 GCM 令牌

如何为多个收件人加密一封邮件?