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

使用Python SDK调用MS Graph API遇权限不足,HTTP请求正常

解决Graph API Python SDK使用UsernamePasswordCredential时的403权限不足问题

1. 核对权限范围(Scopes)一致性

之前用acquire_token_by_username_password获取令牌时指定的scopes,必须和当前GraphServiceClient初始化时传入的self._scopes完全匹配。比如:

  • 若之前请求用的是["https://graph.microsoft.com/User.Read.All"],现在SDK的scopes不能仅写["User.Read.All"](部分场景简写可行,但严格匹配更稳妥)
  • 调用client.users.get()需要User.Read.All委托权限,确保scopes包含该权限。

2. 确认权限的管理员同意状态

登录Azure AD应用注册后台,找到目标应用:

  • 进入API权限页面,检查已添加的委托权限(如User.Read.All)是否标记为已授予[你的租户名称]管理员同意
  • 对于全局类权限(如读取所有用户),仅添加权限不够,必须由租户管理员完成同意操作,否则普通用户授权无法生效。

3. 验证令牌实际包含的权限

添加代码获取并解析令牌,确认实际权限是否符合预期:

import jwt
from azure.identity import UsernamePasswordCredential

credential = UsernamePasswordCredential(
    client_id="你的客户端ID",
    username="用户名",
    password="密码"
)
# 获取令牌
token = credential.get_token("https://graph.microsoft.com/.default")
# 解码令牌(跳过签名验证,仅用于查看权限)
decoded_token = jwt.decode(token.token, options={"verify_signature": False})
# 查看委托权限
print("令牌包含的权限:", decoded_token.get("scp"))

如果输出里没有所需的权限(如User.Read.All),说明权限配置或授权流程存在问题。

4. 检查Graph API版本与账号权限

  • 确认GraphServiceClient使用的API版本和之前requests请求一致:默认是v1.0,若之前用的beta版本,需在初始化时指定:
    GraphServiceClient(credential, self._scopes, base_url="https://graph.microsoft.com/beta")
    
  • 若当前请求是读取所有用户,需确保账号本身拥有对应的目录角色权限(如全局管理员、用户管理员),仅应用权限授权不够,账号自身也需要操作权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:53:27