POST请求超时请求APN服务器

时间:2017-06-16 10:05:13

标签: ruby-on-rails apple-push-notifications http2

我试图通过Rails后端设置Apple推送通知。我使用NetHttp2 gem创建连接,使用jwt签署我的令牌。

这是我在尝试各种帖子请求组合时得到的回复示例。如果我省略"授权"我会得到快速回复。标题,如果我给它垃圾或假令牌,类似。但是,如果我使用我编码的实际令牌,则连接会超时。我不知道Apple在后端做了什么 - 我根本没有任何消息。

    [22] pry(main)> request = client.call(:post, '/3/device/adknerulkdf2345nl', 
body: "{ 'aps' => { 'hello' => 'hello' }", headers: {  "apns-topic" => "something" })
    => #<NetHttp2::Response:0x007fbee8226c90 @body="{\"reason\":\"MissingProviderToken\"}", @headers={":status"=>"403", "apns-id"=>"690A959F-27F0-5B5C-1173-0316D6CE4C91"}>
    [23] pry(main)> request = client.call(:post, '/3/device/adknerulkdf2345nl', 
body: "{ 'aps' => { 'hello' => 'hello' }", headers: { 'authorization' => "bearer garbage", "apns-topic" => "something" })
    => #<NetHttp2::Response:0x007fbeebbbf060 @body="{\"reason\":\"InvalidProviderToken\"}", @headers={":status"=>"403", "apns-id"=>"8EF335C7-1F05-1D99-5425-CCF200960626"}>
    [24] pry(main)> request = client.call(:post, '/3/device/adknerulkdf2345nl', 
body: "{ 'aps' => { 'hello' => 'hello' }", headers: { 'authorization' => "bearer snwekrwunlsdfu.sdlfknweru.awepi234np2", "apns-topic" => "something" })
    => #<NetHttp2::Response:0x007fbee7f38f88 @body="{\"reason\":\"InvalidProviderToken\"}", @headers={":status"=>"403", "apns-id"=>"C3B48281-C7F1-22B0-6159-0FD0B79C1D43"}>
    [25] pry(main)> request = client.call(:post, '/3/device/adknerulkdf2345nl', 
body: "{ 'aps' => { 'alert' => 'hello' }", headers: { 'authorization' => "bearer #{token}", "apns-topic" => "something" })
    SocketError: Socket was remotely closed

我该如何调试?有没有办法查看Apple服务器上发生了什么?

如果没有,有人设置了这个并有一些提示吗?老实说,我完全不确定我是否正确编码JWT令牌。我正在尝试使用Apple提供的p8令牌并使用&#39; ES256&#39;设置,但我不知道如何验证它。如果我用令牌+垃圾发出另一个请求,它也会永远挂起。

以下是相关代码的其余部分:

client = NetHttp2::Client.new("https://api.development.push.apple.com:443", 
{ connect_timeout: 100000})
token = JWT.encode({'alg': 'ES256', 'kid': APNS_KEY_ID}, 
(OpenSSL::PKey::EC.new @p8key), 'ES256', 
{'iss': TEAM_ID, 'iat': DateTime.now().to_time.to_i})

经过多次心痛,解决方案

我仍然不完全确定Apple发生了什么,但答案是我的令牌编码。正确的格式是:

  token = JWT.encode(
    {
      "iss": TEAM_ID,
      "iat": DateTime.now().to_time.to_i
    },
    private_key, 
    ALGORITHM,
    header_fields= {
      "alg": ALGORITHM, 
      "kid": APNS_KEY_ID
    }
  )

如果您使用格式为authorization => bearer WHATEVER的Apple 某些,它将永远挂起来尝试进行身份验证。 JWT库非常关注订单和密钥(截至2012年6月29日)。

0 个答案:

没有答案