iOS 使用 APNs 身份验证密钥发送推送:突然"403 禁止访问:{"原因":"无效提供商令牌"}"



我正在使用apns auth键("永不过期")发送我的推送通知,直到突然我得到

403 Forbidden: {"reason":"InvalidProviderToken"}

发送推送通知时的响应。当它运行一次时,造成这种情况的原因是什么,突然间,它并非没有到期日期?同时,它再次工作了一些推动,但是现在我再次遇到了错误...其他人是否遇到过?

编辑

不确定,但似乎这仅发生在Ubuntu服务器上,而不是在我的本地(OS X)机器上发生...

使用相同的连接发送向不同的团队ID时,我们遇到了完全相同的问题。复制步骤是:

  • 打开与APNS的连接并使用相同的连接 to:

  • 将基于令牌的推送发送到Team ID 1234的主题com.companyA.xxx:APNS接受并成功提供推动。

  • 将基于令牌的推送发送到Team ID 5678的主题io.companyB.xxx:APNS响应HTTP 400 BadRequest The device token does not match the specified topic
  • 再次将基于令牌的推动发送到Team ID 5678的主题io.companyB.xxx:APNS响应HTTP 403 Forbidden: the provider token is not valid or the token signature could not be verified

之后,不可能发送任何推动,并且必须关闭连接并重新打开。

我们最终要做的解决方法是每个团队ID 打开一个连接。APNS文档没有提及类似的内容,因此我确实将其视为错误,我打开了一个错误报告。

我已经在几个情况下看到了这一点:

  1. 重新提交过期的提供商令牌似乎使令牌被列入黑名单,并导致随后的InvalidProviderToken拒绝而不是ExpiredProviderToken拒绝。检查您的登录令牌是否有效消息。检查系统时钟以确保您不会使用偏斜的时间戳生成令牌。

  2. 提交无效主题将使连接上的所有提供商令牌无效(甚至先前有效)。仅提交密钥绑定的主题,并且每个连接仅使用一个密钥。

对我来说,有一个不良配置的问题。我使用了错误的团队ID。在查看任何其他解决方案之前,请确保所有配置都是正确的。

服务器确实会以无效的响应和/或过期的通话响应。您的身份验证令牌不应包含任何'=',' ',' - ',仔细检查您的令牌是否没有。此外,签名(令牌的第三部分,应为基本64url编码,因此没有先前提到的字符)。

对我而言,服务器时间无效,修复了服务器时间解决问题

我要求苹果将我的帐户从个人帐户更改为业务帐户。我的推送通知证书仍然说一切都很好,但是通知不起作用,而且我得到了响应Invalid Token。一旦我撤销了证书并发布了新证书(在Apple Connect中),一切都很好。

我浪费了很多时间试图找出为什么推动通知不起作用。希望这可以节省其他人!

我一直在使用密钥的名称而不是密钥ID。在https://developer.apple.com/account/resources/authkeys/review/上验证显示正确的值。

我的情况与JSON漂亮打印格式有关。与可以接受JWT漂亮打印格式的Musickit不同,APN仅接受原始格式。

详细说明:我的消息是:

{
  "alg": "ES256",
  "kid": "SOMEKEYID"
}
{
  "iss": "SOMETEAM",
  "iat": 1581110460
}

我通过jwt.io验证了JWT的结果,但是APN不断告诉我无效的Providertoken。我已经尝试了上面的一切。无用。

最后,我将消息更改为:

{"alg":"ES256","kid":"SOMEKEYID"}
{"iss":"SOMETEAM","iat":1581128155}

然后它通过而没有错误。

事实证明,APN不接受JSON漂亮格式!

苹果的APN文档说:

APNS仅支持与提供者身份验证令牌 ES256算法。无抵押的JWT [JSON Web令牌]或JWTS签名 使用其他算法被拒绝,您的提供商服务器收到 无效的Providertoken(403)响应。

因此,似乎问题与您的auth kiey没有;这实际上是从密钥生成的网络令牌的问题。

相关内容

最新更新