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

使用Python的msal和requests调用REST API无法获取Azure订阅

问题分析与解决方案

核心原因:认证流身份差异

你浏览器里捕获的token是用户身份的授权码/隐式流凭证,依赖用户自身对Azure订阅的权限;而代码里用的是客户端凭证流,这个流是应用以自身身份访问资源,和用户身份完全无关,两者的权限体系不通用。

关键问题拆解

  1. AADSTS1002012错误原因
    客户端凭证流属于「无用户参与」的认证模式,必须使用资源的/.default后缀作为scope(比如https://management.azure.com/.default),不能指定user_impersonation——这个权限是给**有用户参与的流(比如授权码流)**用的,用于让应用代表用户操作,和客户端凭证流不兼容。

  2. 空订阅列表原因
    客户端凭证流的token对应的是你的Azure AD应用身份,而非用户身份。浏览器里能拿到订阅是因为用户有权限,但你的应用本身没有被分配任何Azure订阅的访问权限,所以调用API返回空列表。

解决步骤

  • 修正Scope配置:代码里的scope必须设为["https://management.azure.com/.default"],移除user_impersonation,示例代码片段:
    scope = ["https://management.azure.com/.default"]
    result = app.acquire_token_for_client(scopes=scope)
    
  • 给应用分配订阅权限:
    • 登录Azure门户,找到目标订阅,进入「访问控制(IAM)」页面。
    • 点击「添加」→「添加角色分配」,选择合适的角色(如「读者」「参与者」)。
    • 在「成员」页签选择「用户、组或服务主体」,搜索并选中你的Azure AD应用,完成分配。
  • 等待权限生效:IAM权限通常需要1-5分钟生效,之后重新获取token调用API即可拿到订阅列表。

关于OBO流的说明

OBO流是中间层应用代表已登录用户访问下游资源的场景,必须依赖用户的初始token,不符合你「无需用户交互」的需求,所以不需要使用。

内容的提问来源于stack exchange,提问作者SodaCris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:50:57