当前位置: 首页 > 知识库问答 >
问题:

使用python SAS令牌连接到服务总线

申屠乐池
2023-03-14

我需要使用SAS令牌连接到Azure服务总线(生成并连接)。

我没有看到任何关于python实现的东西。

此链接提供Eventhubs的实现-

https://docs.microsoft.com/en-us/rest/api/eventhub/generate-sas-token#python

不确定在哪里可以找到servicebus的python实现。

共有2个答案

穆锋
2023-03-14

使用Azure门户创建服务总线后,ServiceBusService对象可用于处理队列。

有关创建队列、向队列发送消息、使用python从队列接收消息以编程方式访问服务总线的详细信息,请参阅此文档。

诸葛乐逸
2023-03-14

我已经找到了一种方法,您可以在ServiceBusService类中执行此操作。运行"pip安装azure.servicebus"后,我将其导入为:

from azure.servicebus.control_client import ServiceBusService

ServiceBusService构造函数接受一个名为“authentication”的参数,默认情况下未指定该参数。

如果进入ServiceBusService init文件,您可以更详细地了解身份验证是如何处理的。

if authentication:
        self.authentication = authentication
    else:
        if not account_key:
            account_key = os.environ.get(AZURE_SERVICEBUS_ACCESS_KEY)
        if not issuer:
            issuer = os.environ.get(AZURE_SERVICEBUS_ISSUER)

        if shared_access_key_name and shared_access_key_value:
            self.authentication = ServiceBusSASAuthentication(
                shared_access_key_name,
                shared_access_key_value)
        elif account_key and issuer:
            self.authentication = ServiceBusWrapTokenAuthentication(
                account_key,
                issuer)

如果未传递自定义身份验证对象,则它将尝试使用ServiceBusSAS身份验证类,如果填充shared_access_key_name和shared_access_key_value,则默认使用该类。

因此,如果跳入ServiceBusSASAuthentication类,您会注意到一些有用的东西。

class ServiceBusSASAuthentication:
    def __init__(self, key_name, key_value):
        self.key_name = key_name
        self.key_value = key_value
        self.account_key = None
        self.issuer = None

    def sign_request(self, request, httpclient):
        request.headers.append(
            ('Authorization', self._get_authorization(request, httpclient)))

    def _get_authorization(self, request, httpclient):
        uri = httpclient.get_uri(request)
        uri = url_quote(uri, '').lower()
        expiry = str(self._get_expiry())

        to_sign = uri + '\n' + expiry
        signature = url_quote(_sign_string(self.key_value, to_sign, False), '')

        auth_format = 'SharedAccessSignature sig={0}&se={1}&skn={2}&sr={3}'  # <----awww, yeah
        auth = auth_format.format(signature, expiry, self.key_name, uri)

        return auth  # <--after inserting values into string, the SAS Token is just returned.

    def _get_expiry(self):  # pylint: disable=no-self-use
        '''Returns the UTC datetime, in seconds since Epoch, when this signed
        request expires (5 minutes from now).'''
        return int(round(time.time() + 300))

sign_request函数是ServiceBusService类在进行身份验证时直接引用的唯一函数,但是您会注意到它所做的只是向请求添加身份验证标头...是SAS代号的形式。

因此,在这一点上,我拥有了创建自己的身份验证类所需的所有信息。我做了一个和这个一模一样的。

class ServiceBusSASTokenAuthentication:
    def __init__(self, sas_token):
        self.sas_token = sas_token

    # this method is the one used by ServiceBusService for authentication, need to leave signature as is
    # even though we don't use httpClient like the original.
    def sign_request(self, request, httpclient):
        request.headers.append(
            ('Authorization', self._get_authorization())
        )

    def _get_authorization(self):
        return self.sas_token

我可能可以一起去掉_get_auth函数,但我还没有完善所有的东西。

现在,如果您使用有效的SAS令牌在ServiceBusService构造函数中像这样调用这个类,它应该可以工作。

            subscription_client = ServiceBusService(
                authentication=ServiceBusSASTokenAuthentication(sas_token=sas_token),
                service_namespace=service_namespace
            )
 类似资料:
  • 我需要将一条消息从运行在SQL Server2014下的SSIS包放入Azure ServiceBus队列中。正如本文所建议的:从ssis连接到azure服务总线队列,我编写了一个引用“azure SDK2.9”的脚本任务。这种方法适用于Azure存储帐户处理Blob(引用Microsoft.WindowsAzure.Storage程序集),但不适用于Azure存储总线(引用Microsoft.S

  • 另一个用户'sJohnston'问了一个与我的问题相关的问题: 在进行了您建议的更改后,我得到了以下错误: 连接到Azure服务总线:log4j:warn找不到记录器(com.microsoft.windowsazure.services.servicebus.ServiceBusContract)的追加器。log4j:警告请正确初始化log4j系统。log4j:警告有关详细信息,请参阅http:

  • 是否可以从应用程序中创建JWT令牌,并使用GCP服务帐户在应用程序中验证它?我如何在Python中做到这一点? 这两个应用程序都部署在GCP中。应用程序可以部署在GCF、Cloud Run、AppEngine、GKE甚至GCE中。 我花了一些时间阅读Google Cloud文档,但我没有找到如何处理服务间身份验证的“通用”答案。(很可能是因为它们对每个GCP产品都不相同) 那么,考虑到我们抛开了谷

  • 我正在使用新的Windows Server Service Bus 1.0测试版开始一个新项目的工作。我正在尝试在AWS EC2虚拟机上设置测试环境。 我已经在AWS EC2上运行的Windows Server 2008 R2实例上安装了服务总线,并根据MSDN文档中的示例设置了新的服务器场、容器和主机。我在服务器上打开了所有正确的端口(4443和9354)。我还按照[本页][1]中的说明将自行生

  • 除了用户名和密码(例如来自ACS的令牌)之外,是否还有其他使用AMQP对Azure服务总线进行授权的方法? 在我的场景中,我希望能够在不公开凭据的情况下为资源级客户端提供对服务总线的访问权限。