Python调用Synapse数据平面API报InvalidTokenAuthenticationAudience错误
问题原因
InvalidTokenAuthenticationAudience错误由访问令牌受众不匹配触发:申请AAD令牌时传入的目标资源标识错误,导致令牌的aud声明值不符合Synapse数据平面API的校验规则,鉴权被拒绝。
原代码令牌获取逻辑存在两处错误:
- ADAL库
acquire_token_with_client_credentials方法的参数顺序为(resource, client_id, client_secret),第一个参数需传入待访问服务的资源标识符,原代码错传为服务主体自身的客户端ID - Synapse数据平面API要求令牌对应的资源标识必须为Synapse服务公开端点,不能混用ARM控制平面、Microsoft Graph等其他服务的资源标识
修复步骤
- 修正令牌获取参数:第一个参数传入Synapse数据平面合法资源URI
https://dev.azuresynapse.net/(末尾斜杠不可省略,需完全匹配),第二个参数传入服务主体客户端ID,第三个参数传入服务主体客户端密钥 - 配置工作区权限:在Synapse工作区的访问控制(IAM)中,给调用的服务主体分配至少
Synapse Artifact User角色,否则令牌校验通过后仍会返回403权限错误
修复后可运行代码
import requests import adal TENANT_ID = "XXX" CLIENT_ID = "XXX" CLIENT_SECRET = "XXX" AUTHORITY = f"https://login.microsoftonline.com/{TENANT_ID}" context = adal.AuthenticationContext(AUTHORITY) # 修正参数顺序与资源URI token = context.acquire_token_with_client_credentials( resource="https://dev.azuresynapse.net/", client_id=CLIENT_ID, client_secret=CLIENT_SECRET ) endpoint = "https://XXX.dev.azuresynapse.net/linkedservices?api-version=2020-12-01" http_headers = { 'Authorization': 'Bearer ' + token['accessToken'], 'Accept': 'application/json', 'Content-Type': 'application/json' } response = requests.get(url=endpoint, headers=http_headers) print("response.text:", response.text)
校验排查方法
如果修复后仍报错,可对返回的accessToken做JWT解码,检查payload中aud字段值:
- 若值为
https://management.azure.com/或https://management.core.windows.net/,说明传入了ARM控制平面的资源标识,该类令牌仅能用于Synapse控制平面操作,无法调用数据平面接口 - 若值为服务主体的CLIENT_ID,说明资源参数仍传错,需重新检查参数传入顺序
- 补充说明:ADAL库已停止官方维护,长期使用建议迁移到MSAL库,MSAL申请令牌时对应的Synapse资源标识与上述值一致
内容的提问来源于stack exchange,提问作者siddarfer
相关产品推荐
相关产品推荐

