ruby - 从 Ruby 连接到适用于 Windows Phone 8 的 Microsoft 推送通知服务

标签 ruby ssl notifications windows-phone-8 push

我们正在开发一个需要推送通知的 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 进行系统调用? (如果我们不能很快让它工作,我可能不得不做最后一个作为临时解决方案)。

非常感谢任何输入!

谢谢, 肯尼

最佳答案

尝试使用像 http://mitmproxy.org 这样的工具比较来自您的代码和 curl 的请求。

例如,除了指定 header 之外,curl 还会发送 User-AgentAccept header ,Microsoft 服务器可能出于某种原因正在检查这些 header 。

如果这没有帮助 - 那么它与 ssl 相关

关于ruby - 从 Ruby 连接到适用于 Windows Phone 8 的 Microsoft 推送通知服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16603814/

相关文章:

java - 将通知置于分隔线 android java 下方

ruby-on-rails - 如何对对象数组进行排序?

ssl - 在 Amazon ec2 用户中安装 GoDaddy SSL

java - 调用 JAX-RS Web 服务时发生 CertificateException

Android:静态状态栏通知

java - 在 Android 中处理暂停/恢复和使用通知(使用 AndEngine)

ruby - 学习Ruby的好地方是什么?它主要用于什么?

ruby-on-rails - 实例化 Mechanize 对象时出错

ruby - 如何触发并忘记子流程?

java高级休息客户端连接给出ssl错误