使用Python的msal和requests调用REST API无法获取Azure订阅
问题分析与解决方案
核心原因:认证流身份差异
你浏览器里捕获的token是用户身份的授权码/隐式流凭证,依赖用户自身对Azure订阅的权限;而代码里用的是客户端凭证流,这个流是应用以自身身份访问资源,和用户身份完全无关,两者的权限体系不通用。
关键问题拆解
AADSTS1002012错误原因
客户端凭证流属于「无用户参与」的认证模式,必须使用资源的/.default后缀作为scope(比如https://management.azure.com/.default),不能指定user_impersonation——这个权限是给**有用户参与的流(比如授权码流)**用的,用于让应用代表用户操作,和客户端凭证流不兼容。空订阅列表原因
客户端凭证流的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
相关产品推荐
相关产品推荐

