Как аутентифицировать соединение WAMP через тикет в python - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь подключиться к шине WAMP из другого приложения, для которого настроены определенные роли. Роли аутентифицируются с помощью билета static , поэтому я считаю, что мне нужно объявить, к какой роли я хочу подключиться и каков связанный билет. Я пишу это на Python, и большинство компонентов настроено, но я не могу найти никакой документации о том, как выполнить такую ​​аутентификацию.

from autobahn.twisted.component import Component, run

COMP = Component(
    realm=u"the-realm-to-connect",
    transports=u"wss://this.is.my.url/topic",
    authentication={
        # This is where I need help
        # u"ticket"?
        # u"authid"?
    }
)

Без аутентификации я могу подключаться к шине WAMP и публиковать ее, когда она локально работает на моем компьютере, но она настроена на публикацию анонимными пользователями. Моя производственная шина WAMP не позволяет анонимным пользователям публиковать, поэтому мне нужно проверить, с какой ролью это связано. Документация Autobahn | Python подразумевает, что это может быть сделано в Python, но я только смог найти примеры того, как сделать это в JavaScript / JSON в документации Crossbar.io .

Ответы [ 2 ]

0 голосов
/ 31 января 2019

документация не очень актуальна. С Компонентом необходимо делать так для билетов:

from autobahn.twisted.component import Component, run

component = Component(
    realm=u"the-realm-to-connect",
    transports=u"wss://this.is.my.url/topic",
    authentication={
        "ticket": {
            "authid": "username", 
            "ticket": "secrettoken"
        }
    },
)
0 голосов
/ 10 июля 2018

Вот несколько примеров, которые могут быть вам полезны:

https://github.com/crossbario/crossbar-examples/tree/master/authentication

Я думаю, вам нужно использовать метод динамической аутентификации WAMP-Ticket.

Динамическая аутентификация WAMP-Ticket - это простой вызов открытого текста схема. Клиент соединяется с областью под некоторым authid и запросами authmethod = тикет. Crossbar.io будет «оспаривать» клиента, спрашивая за билет. Клиент отправляет билет, и Crossbar.io будет в включите вызов пользователь внедрил процедуру WAMP для фактического проверка билета.

Итак, вам нужно создать дополнительный компонент для аутентификации пользователей:

from autobahn.twisted.wamp import ApplicationSession
from autobahn.wamp.exception import ApplicationError

class AuthenticatorSession(ApplicationSession):

   @inlineCallbacks
   def onJoin(self, details):

      def authenticate(realm, authid, details):
         ticket = details['ticket']
         print("WAMP-Ticket dynamic authenticator invoked: realm='{}', authid='{}', ticket='{}'".format(realm, authid, ticket))
         pprint(details)

         if authid in PRINCIPALS_DB:
            if ticket == PRINCIPALS_DB[authid]['ticket']:
               return PRINCIPALS_DB[authid]['role']
            else:
               raise ApplicationError("com.example.invalid_ticket", "could not authenticate session - invalid ticket '{}' for principal {}".format(ticket, authid))
         else:
            raise ApplicationError("com.example.no_such_user", "could not authenticate session - no such principal {}".format(authid))

      try:
         yield self.register(authenticate, 'com.example.authenticate')
         print("WAMP-Ticket dynamic authenticator registered!")
      except Exception as e:
         print("Failed to register dynamic authenticator: {0}".format(e))

и добавьте метод аутентификации в конфигурацию:

"transports": [
                {
                    "type": "web",
                    "endpoint": {
                        "type": "tcp",
                        "port": 8080
                    },
                    "paths": {
                        "ws": {
                            "type": "websocket",
                            "serializers": [
                                "json"
                            ],
                            "auth": {
                                "ticket": {
                                    "type": "dynamic",
                                    "authenticator": "com.example.authenticate"
                                }
                            }
                        }
                    }
                }
            ]
...