2017-05-24 6 views
0

私のアプリでウェブプッシュプロトコルでウェブプッシュ通知を使用しようとしています。 VAPIDでプッシュAPIを使用するには、applicationServerKeyが必要です。JavaでVAPIDキーを生成し、JavaScript PushManagerに渡します。

PushManager subscribeメソッドは、パラメータとしてVAPIDキー(公開キーのみ)を受け取り、サブスクリプションのエンドポイントとプッシュメッセージのキーを与えます。

VAPIDキーを生成するには、node.js(Google web-pushパッケージ)とopensslを使用しています。しかし私の使用例では、VAPIDキーはJava内で生成され、ブラウザから購読するためにJavaScriptに渡されるべきです。

私はVAPIDキーを生成するためにJavaで以下のコードを試しています。私は鍵を正常に作成できますが、生成された公開鍵(base64でエンコードされた文字列)を渡すと、

サービスワーカーを登録できません。 DOMException:私はこの問題を解決してください。..提供applicationServerKeyは有効ではありません

: 'をPushManager' on 'にサブスクライブ' の実行に失敗しました。私の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

こんにちは - 任意の運?あなたも私にいくつかのポインタを提供することはできますか? – csharpnewbie

答えて

1

MartijnDwarsからの回答は下記を参照してください。 https://github.com/web-push-libs/webpush-java/issues/30

あなたはバイト[]にしてJava-生成 のPublicKeyを変換するUtils.savePublicKeyを使用することができます。このbyte []は、 PushManager.subscribeメソッドに渡されます。

Javaではbyte []をbase64でエンコードし、JavaScriptでは base64でbase64をデコードする方が便利です。たとえば、Javaで 鍵ペアを生成した後:JavaScriptで次に

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

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

ソリューションへのリンクは歓迎しますが、あなたの答えはそれが無ければ有用であることを確認してください:[リンク上の文脈を追加](// meta.stackexchange.com/a/8259)あなたの仲間のユーザーは、なぜそれがあるのか​​、ターゲットページが利用できない場合にリンクしているページの最も関連性の高い部分を引用します。 [リンク以上の回答は削除される可能性があります。](// stackoverflow.com/help/deleted-answers) – Rob

+2

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参照のためのリンク。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 17849093) –

関連する問題