使用Azure服务主体令牌调用Databricks Jobs API GET接口遇Aud声明错误
问题分析与解决
错误原因
你遇到的400错误是因为服务主体生成的JWT令牌受众(aud)声明不匹配:Databricks Jobs API期望的aud是2ff814a6-3304-4ab8-85cb-cd0e6f879c1d(Databricks服务的资源ID),但你的令牌实际aud是00000002-0000-0000-c000-000000000000(Microsoft Graph的资源ID)。这说明生成令牌时请求的目标资源不正确,导致令牌无法被Databricks的GET API验证通过(POST请求可能采用了不同的验证逻辑)。
解决步骤
1. 修正令牌请求端点
你的token_endpoint中的<databricks-instance>是错误的,需替换为Azure AD租户ID(可以是租户GUID或域名,比如contoso.onmicrosoft.com)。正确格式:
token_endpoint = "https://login.microsoftonline.com/<your-azure-ad-tenant-id>/oauth2/token"
2. 调整Scope参数
生成针对Databricks的令牌,需指定正确的资源范围,两种可选格式:
- 方式一:使用Databricks服务资源ID
"scope": "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default" - 方式二:使用你的Databricks工作区URL
"scope": "https://adb-1366553829746932.12.azuredatabricks.net/.default"
3. 完整修正后的令牌生成代码
import requests import json from databricks_cli.sdk.service import JobsService from databricks_cli.sdk.api_client import ApiClient import time # 生成服务主体令牌请求 sp_id = dbutils.secrets.get("scope name", "key") sp_sec = dbutils.secrets.get("scope name", "key") # 替换为你的Azure AD租户ID token_endpoint = "https://login.microsoftonline.com/<your-azure-ad-tenant-id>/oauth2/token" token_request_data = { "grant_type": "client_credentials", "client_id": sp_id, "client_secret": sp_sec, "scope": "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default" } # 发送请求获取令牌 response = requests.post(token_endpoint, data=token_request_data) token_sp = response.json()["access_token"]
4. 验证令牌正确性
用jwt.io解码token_sp,确认aud字段值为2ff814a6-3304-4ab8-85cb-cd0e6f879c1d,再调用Jobs API的GET接口即可正常工作。
内容的提问来源于stack exchange,提问作者Rio
相关产品推荐
相关产品推荐

