2013-05-17 2 views
6

Nous développons une application WP8 qui nécessite des notifications push. Pour le tester, nous avons lancé la requête POST de notification push avec la ligne de commande CURL, en vérifiant qu'elle se connecte réellement, authentifie avec le certificat SSL client et envoie les données correctes. Nous savons pertinemment que ce travail comme nous recevons pousse aux appareils.Connexion à Microsoft Push Notification Service pour Windows Phone 8 à partir de Ruby

C'est la commande CURL nous avons utilisé à des fins de test:

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 

Bien sûr, notre certificat SSL est nécessaire pour réellement utiliser l'URL, mais j'espérant que quelqu'un d'autre a fait cela et peut voir ce que nous faisons mal. Maintenant, notre problème est que nous devons faire ce travail avec Ruby à la place, quelque chose que nous n'avons pas réussi à faire fonctionner jusqu'à présent.

Nous avons essayé d'utiliser HTTParty sans chance, et aussi net/http directement sans aucune chance.

Voici un script de test de HTTParty très simple, je l'ai utilisé pour tester avec:

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 

Cela semble se connecter avec SSL correctement, mais le serveur renvoie IIS MS 403 à nous pour une raison quelconque, nous n » t obtenir.

est ici essentiellement la même chose que j'ai essayé d'utiliser 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 

Comme la version HTTParty, cela renvoie également 403 ..

Je commence à avoir le sentiment que cela ne fonctionnera pas réellement avec net/http, mais j'ai aussi vu quelques exemples de code prétendant fonctionner, mais je ne vois pas de différence par rapport à ce que nous avons testé ici.

Est-ce que quelqu'un sait comment résoudre ce problème? C'est possible? Devrais-je utiliser libcurl à la place peut-être? Ou même faire un appel système à curl? (Je devrais peut-être faire le dernier comme solution provisoire si nous ne pouvons pas obtenir ceci pour fonctionner bientôt).

Toute contribution est grandement appréciée!

Merci, Kenny

+0

Des progrès de votre côté? J'ai essayé de Node.js avec le code semblable et ai été coincé. Je souhaite que je puisse voir un journal des erreurs sur la zone Centre de développement pour les certificats ou quelque chose pour aider à diagnostiquer ce que le problème peut être. –

+0

Désolé pour la réponse tardive, mais non, ne pouvait pas le faire fonctionner. Nous avons dû recourir à appeler CURL pour l'instant .. –

Répondre

0

Essayez d'utiliser certains outils comme http://mitmproxy.org pour comparer les demandes de votre code et boucle. Par exemple curl en plus des en-têtes spécifiés envoie User-Agent et Accept -headers, les serveurs Microsoft peuvent vérifier pour ces raisons.

Si cela n'aide pas - alors c'est lié à ssl

Questions connexes