2017-06-06 3 views
0

私は、フロントエンドからVertxバックエンドにsock.js接続をしようとしています。Vertx SockJsイベントバス認証

私の最初の試みは、このように見えた:

let token = '<the token>'; 
let data = {'Authorization' : 'Bearer ' + token}; 
let eb = new EventBus("http://localhost:8080/eventbus"); 
    eb.onopen = function() { 
    eb.registerHandler('notifications', data, (err, msg) => { 
    // handle the response 
    }); 
} 

私は公式sock.jsドキュメントが、これはサポートされていないと述べているにもかかわらず、EventBusの作成時に認証データを送信する必要があるので、これは動作しません。明らかに今はnew EventBus("http://localhost:9090/eventbus", data)を送ってもうまくいきません。このため

https://github.com/sockjs/sockjs-node#authorisation

私のバックエンドハンドラ:

final BridgeOptions bridgeOptions = new BridgeOptions() 
    .addOutboundPermitted(new PermittedOptions().setAddress("notifications")) 

final SockJSHandler sockJSHandler = SockJSHandler.create(vertx).bridge(bridgeOptions, event -> { 
    event.complete(true); 
}); 

router.route("/eventbus/*").handler(ctx -> { 
    String token = ctx.request().getHeader("Authorization"); // null 
}); 
router.route("/eventbus/*").handler(sockJSHandler); 

私はヘッダフィールドAuthroizationを試みたものは何でも、常にnullです。

sock.js接続を認証し、vertexのイベントバス要求に登録する標準的な方法は何ですか?

+0

Vert.xウェブドキュメントの[メッセージの承認が必要](http://vertx.io/docs/vertx-web/java/#_requiring_authorisation_for_messages)セクションを確認しましたか? – tsegismont

+0

はい、私は全体のvertxドキュメント – Markus

+0

OKを読んだことがあります。あなたのスニペットがVert.xのWeb認証機能を使用しているように見えないため、私は尋ねました。 – tsegismont

答えて

2

SockJSはデフォルトでWebSocketを使用します。 JavaScript WebSocket APIを使用してカスタムヘッダー(認証など)を追加することはできません。詳細はthreadをお読みください。

私はあなたが許可を追加する方法を2つの方法は、以下を参照してください

  1. ただ、URLにtokenパラメータを追加します。

    let eb = new EventBus("http://localhost:8080/eventbus?token=" + token); 
    

    、ここでは、サーバー上でそれを得ることができる方法は次のとおりです。

    String token = ctx.request().getParam("token"); 
    
  2. サーバーに接続した後に承認メッセージを送信します。それはtokenフィールドを含むJSONオブジェクトです。

第1のオプションで十分ですが、第2の方法ではイベントバスとSockJSの実装が難しくなると思います。

+0

残念ながら、sockJSではクエリパラメータが許可されていません( 'SockJSでは' '基本URLだけがサポートされています')。 2番目の方法ではうまくいくはずですが、これを行うより良い方法があると思います。これは、標準のvertx * AuthHandler(router.route( "/ eventbus/* "))ハンドラ(jwtAuthHandler);'(または上記のスクリプトで私のテストハンドラと同様の方法) – Markus

+0

'/ eventbus /:token'のようにURLを使用することはできます。わかりやすい、もっと簡単な方法があれば分かります。 – berserkk

+0

私は本当に理由を理解していませんが、あなたのソリューションの1つに基づいて何らかのハックをしなければならないようです。ありがとう – Markus

0

私はCORSが

クロスオリジンリソースの共有を要求するリソースを可能にするための安全なメカニズムで確認してください使用しているウェブソケットを固定するための最良の方法だと思い

router.route().handler(CorsHandler.create(your host origin path).allowCredentials(true)); 

我々は追加することができます

イベントバスブリッジの指定されたアドレスに対してイベントを許可する

BridgeOptions opts = new BridgeOptions() 
      .addInboundPermitted(new PermittedOptions().setAddressRegex(Constants.INBOUND_REGEXP)); 
+0

に行く最良の方法のようだが、認証に役立たない? – Markus

+0

CORSチェックについてお聞きしますか? – Flash

+0

私はsock.jsを使用してユーザーを認証して認証したいと思っています。ヘッダー付きの標準的な方法は機能しません。上記の提案された解決策または類似のもの(sock.js auth readmeを参照)が動作しますが、どちらも非常にハッキリです。私はあなたのCORSソリューションがこれを解決する方法を知りませんか? – Markus

関連する問題