使用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
相关产品推荐
相关产品推荐

