如何通过python中的票证验证WAMP连接

时间:2018-04-26 18:01:54

标签: python authentication autobahn crossbar wamp-protocol

我正在尝试从配置了某些角色的其他应用程序连接到WAMP总线。角色通过静态票证进行身份验证,因此我认为我需要声明我想要连接的角色以及相关票证的内容。我是用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 documentation暗示它可以在Python中完成,但我只能在Crossbar.io's documentation中找到如何在JavaScript / JSON中执行此操作的示例。

2 个答案:

答案 0 :(得分:0)

文档不是最新的。 对于组件,有必要对票证执行以下操作:

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"
        }
    },
)

答案 1 :(得分:-1)

以下是一些对您有帮助的示例:

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

我认为您需要使用WAMP票务动态身份验证方法。

  

WAMP票证动态身份验证是一个简单的明文挑战   方案。客户端根据某些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"
                                }
                            }
                        }
                    }
                }
            ]