2017-05-24 3 views
0

J'essaie d'utiliser les notifications push Web avec le protocole push Web dans mon application. Pour utiliser l'API Push avec VAPID, j'ai besoin d'un applicationServerKey.Générez des clés VAPID en Java et transmettez-les à JavaScript PushManager

La méthode PushManager subscribe prend en paramètre une clé VAPID (clé publique seule) et donne un point d'extrémité d'abonnement et des clés pour pousser les messages.

Pour générer des clés VAPID, j'utilise node.js (package google web-push) et openssl jusqu'à maintenant. Mais dans mon cas d'utilisation, les clés VAPID doivent être générées dans Java et transmises à JavaScript pour s'abonner à partir du navigateur.

J'essaye avec le code ci-dessous dans Java de générer des clés VAPID. Je suis en mesure de créer des clés avec succès mais quand je passe la clé publique générée (chaîne codée en base64), la méthode subscribe renvoie un dicton d'erreur:

Impossible d'enregistrer travailleur de service. DOMException: Échec de l'exécution 'subscribe' sur 'PushManager': Le applicationServerKey fourni n'est pas valide ..

S'il vous plaît me aider à résoudre ce problème. Ci-dessous est mon code Java:

ECNamedCurveParameterSpec parameterSpec = 
ECNamedCurveTable.getParameterSpec("prime256v1"); 
KeyPairGenerator keyPairGenerator = 
KeyPairGenerator.getInstance("ECDH", "BC"); 
keyPairGenerator.initialize(parameterSpec); 
KeyPair serverKey = keyPairGenerator.generateKeyPair(); 

PrivateKey priv = serverKey.getPrivate(); 
PublicKey pub = serverKey.getPublic();` 
System.out.println(Base64.toBase64String(pub.getEncoded())); 
+0

Salut - Tous chance? Pouvez-vous me fournir des indications? – csharpnewbie

Répondre

1

Veuillez vous référer au lien ci-dessous pour la réponse de MartijnDwars. https://github.com/web-push-libs/webpush-java/issues/30

vous pouvez utiliser Utils.savePublicKey pour convertir votre Java généré PublicKey à un octet []. Cet octet [] est ensuite transmis à la méthode PushManager.subscribe .

Il peut être plus pratique de coder en base64 l'octet [] en Java et base64 de décoder la chaîne en JavaScript. Par exemple, après la génération en Java le keypair:

KeyPair keyPair = generateKeyPair(); 
byte[] publicKey = Utils.savePublicKey((ECPublicKey) keyPair.getPublic()); 
String publicKeyBase64 = BaseEncoding.base64Url().encode(publicKey); 
System.out.println("PublicKey = " + publicKeyBase64); 
// PublicKey = BPf36QAqZNNvvnl9kkpTDerXUOt6Nm6P4x9GEvmFVFKgVyCVWy24KUTs6wLQtbV2Ug81utbNnx86_vZzXDyrl88= 

Puis en JavaScript:

function subscribe() { 
    const publicKey = base64UrlToUint8Array('BPf36QAqZNNvvnl9kkpTDerXUOt6Nm6P4x9GEvmFVFKgVyCVWy24KUTs6wLQtbV2Ug81utbNnx86_vZzXDyrl88='); 

    navigator.serviceWorker.ready.then(function (serviceWorkerRegistration) { 
     serviceWorkerRegistration.pushManager.subscribe({ 
      userVisibleOnly: true, 
      applicationServerKey: publicKey 
     }) 
     .then(function (subscription) { 
      return sendSubscriptionToServer(subscription); 
     }) 
     .catch(function (e) { 
      if (Notification.permission === 'denied') { 
       console.warn('Permission for Notifications was denied'); 
      } else { 
       console.error('Unable to subscribe to push.', e); 
      } 
     }); 
    }); 
} 

function base64UrlToUint8Array(base64UrlData) { 
    const padding = '='.repeat((4 - base64UrlData.length % 4) % 4); 
    const base64 = (base64UrlData + padding) 
     .replace(/\-/g, '+') 
     .replace(/_/g, '/'); 

    const rawData = atob(base64); 
    const buffer = new Uint8Array(rawData.length); 

    for (let i = 0; i < rawData.length; ++i) { 
     buffer[i] = rawData.charCodeAt(i); 
    } 

    return buffer; 
} 
+2

Un lien vers une solution est le bienvenu, mais s'il vous plaît assurez-vous que votre réponse est utile sans cela: [ajouter un contexte autour du lien] (// meta.stackexchange.com/a/8259) afin que vos autres utilisateurs aient une idée de ce que c'est et pourquoi c'est là, puis citez la partie la plus pertinente de la page que vous liez au cas où la page cible n'est pas disponible. [Réponses qui sont un peu plus d'un lien peut être supprimé.] (// stackoverflow.com/help/deleted-answers) – Rob

+2

Bien que ce lien peut répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [De l'examen] (/ review/low-quality-posts/17849093) –