如何通过服务主体/OAuth2获取Azure存储账户AAD访问令牌(Python)
Python环境下通过Azure AD服务主体获取Azure存储访问令牌方案
旧版ADAL库本身支持服务主体(客户端凭证)认证模式,跑不通示例基本是令牌资源参数配置错误导致的,目前更推荐使用微软正式维护的MSAL库实现,稳定性和兼容性更好,以下是可直接复用的实现:
前置检查项
- 提前准备好三个必填参数:Azure AD租户ID、服务主体客户端ID(Application ID)、服务主体客户端密钥
- 提前给服务主体分配目标存储账户对应的数据平面RBAC角色(比如存储Blob数据参与者、存储文件数据特权参与者等,注意:经典的订阅级所有者/参与者角色默认不包含存储数据访问权限,必须单独分配数据面角色)
依赖安装
只需要获取令牌的话安装MSAL库即可,需要直接操作存储的话可以额外安装对应存储SDK:
pip install msal # 如需操作Blob存储额外执行 # pip install azure-storage-blob
实现代码
import msal # 替换为自己的配置参数 TENANT_ID = "替换为你的Azure AD租户ID" CLIENT_ID = "替换为服务主体的客户端ID" CLIENT_SECRET = "替换为服务主体的客户端密钥" # 存储服务对应的令牌受众,全局Azure环境固定为该值,主权云需对应调整 STORAGE_TOKEN_AUDIENCE = "https://storage.azure.com/" def get_storage_access_token(): # 初始化机密客户端,对应服务主体认证模式 client = msal.ConfidentialClientApplication( client_id=CLIENT_ID, client_credential=CLIENT_SECRET, authority=f"https://login.microsoftonline.com/{TENANT_ID}" ) # 客户端凭证流请求令牌 token_result = client.acquire_token_for_client( scopes=[f"{STORAGE_TOKEN_AUDIENCE}.default"] ) if "access_token" in token_result: return token_result["access_token"] # 打印错误信息方便排查 print(f"令牌获取失败,错误码:{token_result.get('error')}") print(f"错误详情:{token_result.get('error_description')}") return None if __name__ == "__main__": access_token = get_storage_access_token() if access_token: print("存储访问令牌获取成功") # 令牌使用示例:初始化Blob服务客户端 # from azure.storage.blob import BlobServiceClient # blob_client = BlobServiceClient( # account_url="https://<替换为你的存储账户名>.blob.core.windows.net", # credential=access_token # )
常见踩坑说明
- 之前ADAL示例无法使用的核心原因基本是资源参数配置错误:ADAL客户端凭证流的resource参数必须填
https://storage.azure.com/,如果填成ARM管控面的https://management.azure.com/,拿到的令牌只能用于操作存储账户的管控配置,无法访问存储内的实际数据 - 如果使用Azure中国区、Azure政府区等主权云环境,需要对应调整认证端点和存储令牌受众,比如Azure中国区的认证端点为
https://login.chinacloudapi.cn/{TENANT_ID},存储令牌受众为https://storage.azure.cn/ - 令牌默认有效期为1小时,生产环境不需要手动缓存,MSAL SDK会自动处理令牌刷新逻辑,直接调用
acquire_token_for_client方法即可,SDK会优先返回缓存的有效令牌,过期后自动请求新令牌
内容的提问来源于stack exchange,提问作者olaf
相关产品推荐
相关产品推荐

