我正在尝试从配置了某些角色的其他应用程序连接到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中执行此操作的示例。
答案 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"
}
}
}
}
}
]