我试图通过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日)。