You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过服务主体/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:27:26