Azure Service Bus报错:Token issuer无效,SpringBoot连接问题求助
错误信息
Failed to create receive link test_cd989b_1701894453220
status-code: 401, status-description: InvalidIssuer: Token issuer is invalid.
TrackingId:fbfe2a23-dec8-4d1f-b695-4ce9548b8c9a_G31, SystemTracker:NoSystemTracker,
Timestamp:2023-12-06T20:27:37, errorContext[NAMESPACE: -. ERROR CONTEXT: N/A, PATH: $cbs, REFERENCE_ID:
cbs:receiver, LINK_CREDIT: 0]
问题代码
public ServiceBusReceiverAsyncClient getSBAsyncClient() { ServiceBusReceiverAsyncClient asyncReceiver = new ServiceBusClientBuilder() .credential("-", credential) .receiver() .disableAutoComplete() .queueName("test") .buildAsyncClient(); Disposable subscription = asyncReceiver.receiveMessages() .flatMap(message -> { System.out.printf("Received Seq #: %s%n", message.getSequenceNumber()); System.out.printf("Contents of message as string: %s%n", message.getBody()); // Explicitly settle the message using complete, abandon, defer, dead-letter, etc. return asyncReceiver.complete(message); }) .subscribe(unused -> { }, error -> System.out.println("Error occurred: " + error), () -> System.out.println("Receiving complete.")); return asyncReceiver; }
错误原因及解决方法
1. 命名空间参数无效
代码中.credential("-", credential)的第一个参数为Service Bus命名空间,当前填的"-"是无效值。Azure无法识别空/无效命名空间,直接导致令牌颁发者验证失败。
- 解决:替换为你的Azure Service Bus命名空间全称(格式:
{namespace}.servicebus.windows.net)。
2. DefaultAzureCredential身份配置错误
DefaultAzureCredential会按顺序尝试多种身份验证方式(本地Azure CLI、环境变量、托管标识等),若当前使用的身份没有配置Service Bus的访问权限,或令牌颁发者与命名空间不匹配,会触发该错误。
- 解决:
- 本地开发时,确保Azure CLI已登录正确Azure账号,且账号拥有
Azure Service Bus Data Receiver及以上权限。 - 使用环境变量时,检查
AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_TENANT_ID配置正确,且对应服务主体拥有Service Bus的访问权限。 - Azure托管环境(如App Service)中,启用系统/用户分配托管标识,并给该标识分配Service Bus相关权限。
- 本地开发时,确保Azure CLI已登录正确Azure账号,且账号拥有
3. 令牌受众不匹配
DefaultAzureCredential默认请求的令牌受众可能不符合Service Bus要求,导致颁发者验证失败。
- 解决:构建credential时指定Service Bus的受众URL(格式:
https://{namespace}.servicebus.windows.net/.default):
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build(); TokenCredential scopedCredential = new AzureAuthorityHostCredentialAdapter(credential, "https://{your-namespace}.servicebus.windows.net/.default");
4. 云环境区域不匹配
若Service Bus部署在非全球Azure云(如中国区、政府云),DefaultAzureCredential默认使用全球云颁发者URL,会导致不匹配。
- 解决:构建DefaultAzureCredential时指定对应云环境的AuthorityHost:
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder() .authorityHost(AzureAuthorityHosts.AZURE_CHINA) // 根据实际环境选择 .build();
内容的提问来源于stack exchange,提问作者Matheus Weber

