Java 服务总线共享访问令牌

Java Service Bus Shared Access Token

Configuration config =
                ServiceBusConfiguration.configureWithSASAuthentication(
                        URL,
                        "RootManageSharedAccessKey",
                        token,
                        ".servicebus.windows.net"
                );

这是java服务总线实现的配置代码。我有兴趣传递共享访问签名而不是共享访问密钥。我不确定 java azure sdk 的这个实现是否支持这个。我将如何做到这一点。当我在令牌变量中使用共享访问签名令牌时,我不断收到 401 未经授权的错误。有什么想法吗?

根据 Java 的 Azure 服务总线 SDK source code,函数 configureWithSASAuthentication 的四个参数应该是 namespacesasKeyName , sasKey & serviceBusRootUri(默认传递 ".servicebus.windows.net").

namespacesasKeyNamesasKey您可以通过单击服务总线底部的CONNECTION INFORMATION按钮找到它们,请参见下图。

图1.服务总线页面底部的CONNECTION INFORMATION按钮

图 2. 复制 CONNECTION STRING 并提取命名空间、sasKeyName 和 sasKey

例如连接字符串为Endpoint=sb://abc-ns.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=ABCdefg123!@#=,则namespacesasKeyNamesasKey分别为abc-nsRootManageSharedAccessKey , ABCdefg123!@#=.

所以代码应该如下所示。

Configuration config =
                ServiceBusConfiguration.configureWithSASAuthentication(
                        "abc-ns",
                        "RootManageSharedAccessKey",
                        "ABCdefg123!@#=",
                        ".servicebus.windows.net"
                );

您也可以在服务总线页面的 CONFIGURE 选项卡中找到它们,请参见下图。

图 3. CONFIGURE 选项卡

我可以看到你在这里创建了一个配置对象。一般我们用它在Java中创建话题,例如:

Configuration config =
    ServiceBusConfiguration.configureWithSASAuthentication(
      "namespace",
      "sasKeyName",
      "sasKey",
      "serviceBusRootUri"
      );

ServiceBusContract service = ServiceBusService.create(config);
TopicInfo topicInfo = new TopicInfo("TestTopic");
CreateTopicResult result = service.createTopic(topicInfo);

或者创建队列,例如:

  Configuration config =
        ServiceBusConfiguration.configureWithSASAuthentication(
                "namespace",
                "sasKeyName",
                "sasKey",
                "serviceBusRootUri"
                );

ServiceBusContract service = ServiceBusService.create(config);
QueueInfo queueInfo = new QueueInfo("TestQueue");
CreateQueueResult result = service.createQueue(queueInfo);

我们也可以通过共享访问签名创建它们: 创建主题(c#)

Uri uri = ServiceBusEnvironment.CreateServiceUri("sb", "namespace", string.Empty);
string name = "sasKeyName";
string key = "sasKey";

TokenProvider tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(name, key);

NamespaceManager namespaceManager = new NamespaceManager(uri, tokenProvider);
namespaceManager.CreateTopic("DataCollectionTopic");

创建队列(c#):

Uri uri = ServiceBusEnvironment.CreateServiceUri("sb", 
                "namespace", string.Empty);
string name = "sasKeyName";
string key = "sasKey";

TokenProvider tokenProvider = 
    TokenProvider.CreateSharedAccessSignatureTokenProvider(name, key);
NamespaceManager namespaceManager = 
    new NamespaceManager(uri, tokenProvider);
namespaceManager.CreateQueue("DataCollectionQueue");

名称空间、sasKeyName、sasKey 已在门户中配置,正如 Perter 所展示的那样。