【问题标题】:ServiceBus Node.Js SDK throwing error upon queue creationServiceBus Node.Js SDK 在创建队列时抛出错误
【发布时间】:2019-05-05 18:53:35
【问题描述】:

由于明显的原因,连接字符串/域名的部分内容被星号混淆。

我正在使用来自 npm 的"azure-sb": "^0.11.0"。下面是我尝试创建队列的代码 sn-p。

/* Connection string taken from Azure Portal shared access policies */
let serviceBusService = azure.createServiceBusService(SERVICEBUS_CONNECTION_STRING);

serviceBusService.createQueueIfNotExists(SERVICE_BUS_QUEUE_NAME, function(error){
    if(!error){
        console.log(`Looks like we'll be up and running.`);
    }
    /* This statement gets executed. */
    else {
        console.error(`Something went wrong when trying to boot up: ${error}`);
    }
});

尝试启动时出现问题:错误:401 - InvalidAudience:授权标头包含 带有错误受众的令牌。 跟踪号码: ******, SystemTracker:*****.servicebus.windows.net:Endpoint=sb:/******.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=*******

我没有更改任何设置,使用默认连接字符串(据我所知,在任何地方都没有设置受众)并且它失败了。有什么想法吗?

【问题讨论】:

    标签: node.js azureservicebus azure-servicebus-queues


    【解决方案1】:

    当 javascript 中的设备名称与您生成的 SAS 密钥中的发布者名称不同步时,通常会出现问题。

    例如

    当代码中的 deviceName 变量(在 POST URL 中使用)与 SAS 键中的发布者名称匹配时,无论附加标头是否被注释掉,事情都会正常工作。

    当我将设备名称更改为与 SAS 密钥中的发布者不匹配时,它会立即引发 Invalid Authorization Token Audience 错误。

    只要 deviceName 与 SAS 中的 Publishers 令牌匹配,这件事一整天都可以正常工作,并且注释掉了额外的标头。

    尝试验证,看看是否有帮助。

    【讨论】:

    • 连接字符串中没有设备名称?
    【解决方案2】:

    据我所知,如果您仔细阅读了Azure/azure-sdk-for-node 的文档README.md,您会发现Azure Service Bus 的三个节点包如下。

    1. azure-sbAzure service modules
    2. azure-arm-sbAzure Resource Management (ARM)
    3. azure-asm-sbAzure Service Management (ASM)

    实际上,他们要求您使用不同的身份验证方式来使用不同的功能,请仔细查看文档Authentication.md

    所以对于azure-sb,它似乎是用于访问 Azure ServiceBus 服务,如下面的 npm 包描述。

    适用于 Node.js 的 Microsoft Azure SDK - 库

    本项目提供了一个 Node.js 包,用于访问 Azure ServiceBus 服务。

    要为服务总线实例创建队列,请参考相关的 REST API Create Queue,这是一个资源管理 API。所以我推荐你需要的正确节点包是azure-arm-sbService Principal Authentication

    没有交互的示例代码如下。

    const Azure = require('azure');
    const MsRest = require('ms-rest-azure');
    const ServiceBusManagementClient = require("azure-arm-sb");
    
    MsRest.loginWithServicePrincipalSecret(
      'clientId or appId',
      'secret or password',
      'domain or tenantId',
      (err, credentials) => {
        if (err) throw err
    
        const client = new ServiceBusManagementClient(credentials, 'subscriptionId');
    
        // ..use the client instance to manage service resources.
        client.Queues.createOrUpdate(resourceGroupName, namespaceName, queueName, parameters: sbQueue, function(sbq) {
        })
    
      }
    );
    

    请查看azure-arm-sb package 的更多详细信息。希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      azure-sb 库是较旧的服务总线 SDK。虽然我相信它应该可以工作,但我建议使用最近发布的 @azure/service-bus 的最新版本 7.0.0。

      版本 7 提供 ServiceBusAdministrationClient,可让您管理服务总线实体,支持使用连接字符串和 Azure Active Directory 凭据进行身份验证。

      对于这个问题中的问题,这里是一个使用ServiceBusAdministrationClient 显示队列创建的示例 - administrationClient.ts

      我知道这是一个迟到的回复,但以防万一有人遇到旧的节点服务总线 SDK 问题并登陆这里,请参阅下面的链接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多