2013-05-17 2 views
6

Wir entwickeln eine WP8-App, die Push-Benachrichtigungen benötigt. Um es zu testen, haben wir die Push-Benachrichtigung POST-Anfrage mit CURL-Befehlszeile ausgeführt, stellen Sie sicher, dass es tatsächlich verbindet, authentifiziert sich mit dem Client-SSL-Zertifikat und sendet die richtigen Daten. Wir wissen, dass dies funktioniert, da wir auf die Geräte stoßen.Verbinden mit Microsoft Push Notification Service für Windows Phone 8 von Ruby

Dies ist der CURL Befehl wir zu Testzwecken verwendet haben:

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 

Natürlich unser SSL-Zertifikat benötigt wird, um tatsächlich die URL zu verwenden, aber ich hatte gehofft, dass jemand anderes das und was sehen kann getan hat wir machen falsch.

Jetzt ist unser Problem, dass wir stattdessen mit Ruby arbeiten müssen, was wir bisher nicht geschafft haben.

Wir haben versucht, HTTParty ohne Glück, und auch net/http direkt ohne Glück.

Hier ist ein sehr einfaches HTTParty Testskript ich verwendet habe, mit testen:

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 

Dies scheint mit SSL richtig zu verbinden, aber die MS IIS-Server gibt 403 uns aus irgendeinem Grund, den wir dann don‘ t bekommen.

Hier ist im Wesentlichen das gleiche, was ich versucht habe, mit 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 

Wie die HTTParty Version, diese auch 403 zurück ..

Ich fange an, das Gefühl zu bekommen, dass das wird eigentlich nicht mit net/http funktionieren, aber ich habe auch ein paar Beispiele von Code gesehen, die behaupten zu arbeiten, aber ich sehe keinen Unterschied im Vergleich zu dem, was wir hier getestet haben.

Kann jemand das beheben? Ist es möglich? Sollte ich stattdessen libcurl verwenden? Oder führen Sie sogar einen Systemaufruf durch? (Ich muss das letzte als eine Übergangslösung machen, wenn wir das nicht bald zur Arbeit bringen können).

Jede Eingabe wird sehr geschätzt!

Danke, Kenny

+0

Jeder Fortschritt auf Ihrem Ende? Ich habe von Node.js mit ähnlichem Code versucht und bin festgefahren. Ich wünschte, ich könnte ein Fehlerprotokoll im Dev Center-Bereich für Zertifikate oder etwas zu sehen, um zu diagnostizieren, was das Problem sein könnte. –

+0

Sorry für die späte Antwort, aber nein, konnte es nicht zur Arbeit bekommen. Wir mussten vorerst auf CURL anrufen. –

Antwort

0

Versuchen Sie ein Programm wie http://mitmproxy.org mit Anfragen aus dem Code und curl zu vergleichen.

Zum Beispiel curl zusätzlich zu den angegebenen Headern senden User-Agent und Accept -headers, können Microsoft-Server für diese aus irgendeinem Grund überprüfen.

Wenn das nicht hilft - dann ist es ssl-bezogene