2013-05-17 11 views
6

Opracowujemy aplikację WP8, która wymaga powiadomień push. Aby to przetestować, uruchomiliśmy żądanie POST powiadomienia Push za pomocą wiersza poleceń CURL, upewniając się, że faktycznie łączy się, uwierzytelnia się z certyfikatem SSL klienta i wysyła poprawne dane. Wiemy na pewno, że ta praca, którą otrzymujemy, wypycha urządzenia.Połącz się z usługą powiadomień Microsoft Push dla Windows Phone 8 z Ruby

To polecenie CURL używamy do celów testowych:

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 

Oczywiście potrzebna jest nasza cert SSL faktycznie użyć adresu URL, ale miałem nadzieję, że ktoś inny to zrobił i może zobaczyć, co robimy źle.

Teraz naszym problemem jest to, że musimy pracować z Ruby, czymś, do czego dotychczas nie mogliśmy dotrzeć.

Próbowaliśmy używać HTTParty bez powodzenia, a także net/http bezpośrednio bez żadnego szczęścia.

Tutaj jest bardzo prosty skrypt testowy HTTParty Użyłem do testowania z:

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 

Wydaje się to połączyć z SSL prawidłowo, ale to serwer MS IIS powraca 403 do nas z jakiegoś powodu don” t dostać.

Tutaj jest zasadniczo to samo Próbowałem przy użyciu netto/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 

Podobnie jak w wersji HTTParty, to zwraca również 403 ..

Zaczynam mieć wrażenie, że to nie będzie działać z net/http, ale widziałem też kilka przykładów kodu, które roszczą sobie prawo do pracy, ale nie widzę żadnej różnicy w porównaniu do tego, co testowaliśmy tutaj.

Czy ktoś wie, jak to naprawić? Czy to możliwe? Czy powinienem zamiast tego używać libcurl? A może wywołać systemowe zawinięcie? (Być może będę musiał zrobić to ostatnie jako tymczasowe rozwiązanie, jeśli nie będziemy w stanie szybko tego uruchomić).

Każde wejście jest bardzo doceniane!

Dzięki Kenny

+0

Jakieś postępy na końcu? Próbowałem od Node.js z podobnym kodem i utknąłem. Chciałbym zobaczyć dziennik błędów w obszarze Dev Center dla certyfikatów lub coś, co pomoże zdiagnozować problem. –

+0

Przepraszam za spóźnioną odpowiedź, ale nie, nie mogłem jej uruchomić. Musieliśmy uciekać się do wołania do CURL na razie ... –

Odpowiedz

0

Spróbuj użyć innego narzędzia jak http://mitmproxy.org porównać wnioski ze swojego kodu i dyni.

Na przykład zwinięcie oprócz określonych nagłówków powoduje wysłanie User-Agent i Accept - nagłówków, serwery microsoft mogą być sprawdzanie dla nich z jakiegoś powodu.

Jeśli to nie pomoże - to wiąże się z SSL.

Powiązane problemy