6

プッシュ通知を必要とする WP8 アプリを開発しています。それをテストするために、CURL コマンド ラインでプッシュ通知 POST 要求を実行し、実際に接続し、クライアント SSL 証明書で認証し、正しいデータを送信することを確認しました。デバイスへのプッシュを受信して​​いるため、これが機能することはわかっています。

これは、テスト目的で使用している CURL コマンドです。

curl --cert client_cert.pem -v -H "Content-Type:text/xml" -H "X-WindowsPhone-Target:Toast" -H "X-NotificationClass:2" -X POST -d "<?xml version='1.0' encoding='utf-8'?><wp:Notification xmlns:wp='WPNotification'><wp:Toast><wp:Text1>My title</wp:Text1><wp:Text2>My subtitle</wp:Text2></wp:Toast></wp:Notification>" https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE

もちろん、実際に URL を使用するには SSL 証明書が必要ですが、他の誰かがこれを行って、私たちが間違っていることを確認できることを願っていました。

さて、私たちの問題は、代わりにこれを Ruby で機能させる必要があるということです。

HTTParty を試してみましたが、うまくいきませんでした。また、net/http を直接使ってみましたが、うまくいきませんでした。

これは、私がテストに使用した非常に単純な HTTParty テスト スクリプトです。

require "httparty"

payload = "<?xml version='1.0' encoding='utf-8'?><wp:Notification xmlns:wp='WPNotification'><wp:Toast><wp:Text1>My title</wp:Text1><wp:Text2>My subtitle</wp:Text2></wp:Toast></wp:Notification>"
uri = "https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE"

opts = {
  body: payload,
  headers: {
    "Content-Type" => "text/xml",
    "X-WindowsPhone-Target" => "Toast",
    "X-NotificationClass" => "2"
  },
  debug_output: $stderr,
  pem: File.read("/Users/kenny/Desktop/client_cert.pem"),
  ca_file: File.read('/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt')
}

resp = HTTParty.post uri, opts
puts resp.code

これは SSL で正しく接続されているように見えますが、MS IIS サーバーは何らかの理由で 403 を返します。

これは基本的に、net/http を使用して試したことと同じです。

require "net/http"

url = URI.parse "https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE"
payload = "<?xml version='1.0' encoding='utf-8'?><wp:Notification xmlns:wp='WPNotification'><wp:Toast><wp:Text1>My title</wp:Text1><wp:Text2>My subtitle</wp:Text2></wp:Toast></wp:Notification>"
pem_path = "./client_cert.pem"
cert = File.read pem_path

http = Net::HTTP.new url.host, url.port
http.use_ssl = true
http.cert = OpenSSL::X509::Certificate.new cert
http.key = OpenSSL::PKey::RSA.new cert
http.ca_path = '/etc/ssl/certs' if File.exists?('/etc/ssl/certs') # Ubuntu
http.ca_file = '/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt' if File.exists?('/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt') # Mac OS X
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

r = Net::HTTP::Post.new url.path
r.body = payload
r.content_type = "text/xml"
r["X-WindowsPhone-Target"] = "toast"
r["X-NotificationClass"] = "2"

http.start do
  resp = http.request r
  puts resp.code, resp.body
end

HTTParty バージョンと同様に、これも 403 を返します。

これは実際には net/http では機能しないと感じ始めていますが、機能すると主張するコードの例もいくつか見ましたが、テストしたものと比較して違いは見られませんここ。

これを修正する方法を知っている人はいますか?出来ますか?代わりに libcurl を使用する必要がありますか? または、curl へのシステム コールを実行しますか? (これがすぐに機能しない場合は、暫定的な解決策として最後のものを実行する必要があるかもしれません)。

どんな入力でも大歓迎です!

ありがとう、ケニー

4

1 に答える 1

0

http://mitmproxy.orgのようなツールを使用して、コードと curl からのリクエストを比較してみてください。

たとえば、指定されたヘッダーに加えて curl は sendUser-AgentおよびAccept-headers を実行します。Microsoft サーバーは何らかの理由でこれらをチェックしている可能性があります。

これで解決しない場合は、SSL 関連です

于 2013-07-21T22:01:57.760 に答える