3

現在、クロスバー/アウトバーン経由で Websockets を使用してユーザー通知システムを実装しようとしています。複数のテストを行い、ドキュメントを確認しましたが、次のワークフローを機能させるための解決策があるかどうかはわかりません。

  1. ユーザーは Web アプリでサインイン -- これは JWT を介して行われます
  2. crossbarフロントエンドは、実行中のインスタンスへの Websocket 接続を確立します。
  3. フロントエンドは、ユーザーの通知専用の URI にサブスクライブしようとします。つまりcom.example.notifications.user.23com.example.user.23.notifications'. Where23` はユーザー ID です。
  4. ユーザーの JWT がチェックされ、ユーザーがサブスクリプションへのアクセスを許可されているかどうかが確認されます。
  5. アクティビティが生成されて通知が発生すると、バックエンドはユーザー固有の URI を発行します。

ステップ 3 では、現在サポートされている認証方法に必要なものがあるかどうかわかりません。理想的には、URI パターンに適用できる (クロスバー内に JWT オーセンティケーターを実装するために) カスタマイズできる認証メソッドが必要ですが、サブスクライブしているユーザーにパターン全体へのアクセスを許可することはできません。これは動的認証メソッドによって部分的に解決されますが、後半が欠けています:

例(私の理想的なワークフロー):

  1. ユーザーが URI へのサブスクライブを試みcom.example.user.23.notificationsます。
  2. URI の一致( http://crossbar.io/docs/Pattern-Based-Subscriptions/com.example.user..notificationsのワイルドカード パターン)
  3. 認証トークンが検証され、ユーザーには へのアクセスのみ com.example.user.23.notificationsが許可されます。

上記は簡単な方法で達成できますか?私が知る限り.crossbar/config.json、すべてのユーザー ID の URI 順列を含む を何らかの方法で生成し、新しいユーザーごとに新しい構成を自動的に生成する場合にのみ可能です。

どんな助けでも大歓迎です!

4

1 に答える 1

3

オーソライザーを使用します。

http://crossbar.io/docs/Authorization/#dynamic-authorizationを参照してください

参加/認証時にセッションが割り当てられたユーザー ロールの動的オーソライザーを登録します。

           {
              "name": "authorizer",
              "permissions": [
                {
                  "uri": "com.example.authorize",
                  "register": true
                }
              ]
            },
            {
              "name": "authenticator",
              "permissions": [
                {
                  "uri": "com.example.authenticate",
                  "register": true
                }
              ]
            },
            {
              "name": "user",
              "authorizer": "com.example.authorize"
            },
...
"components": [
    {
      "type": "class",
      "classname": "example.AuthenticatorSession",
      "realm": "realm1",
      "role": "authenticator",
      "extra": {
        "backend_base_url": "http://localhost:8080/ws"
      }
    },
    {
      "type": "class",
      "classname": "example.AuthorizerSession",
      "realm": "realm1",
      "role": "authorizer"
    }
  ]

クラスを書く

class AuthorizerSession(ApplicationSession):
    @inlineCallbacks
    def onJoin(self, details):
        print("In AuthorizerSession.onJoin({})".format(details))
        try:
            yield self.register(self.authorize, 'com.example.authorize')
            print("AuthorizerSession: authorizer registered")
        except Exception as e:
            print("AuthorizerSession: failed to register authorizer procedure ({})".format(e))

    def authorize(self, session, uri, action):
        print("AuthorizerSession.authorize({}, {}, {})".format(session, uri, action))
        if session['authrole'] == u'backend':  # backnend can do whatever
            return True
        [Authorization logic here]
        return authorized
于 2016-02-25T20:52:46.640 に答える