使用Python Flask调用Microsoft Graph API获取组织用户详情时遭遇403 Access Denied错误的解决建议求助
解决Python Flask调用Microsoft Graph API时的Access Denied问题
我帮你分析下这个问题,大概率是几个常见的细节没处理好,你可以按下面的步骤逐一排查:
1. 修复Authorization请求头的格式
这是最容易踩的坑!你直接访问Graph URL时,浏览器可能自动补全了Bearer前缀,但代码里的Authorization头直接用了access_token——正确的格式必须是Bearer {你的access_token}。
修改后的代码示例:
def get_user_details_(access_token: str): url = "https://graph.microsoft.com/v1.0/me" headers = { 'Content-Type': "application/json", # 重点:必须加上Bearer前缀 'Authorization': f'Bearer {access_token}' } # 建议移除verify=False(生产环境绝对不能禁用SSL验证) response = requests.get(url, headers=headers) print("response **** ", response.text) response = response.json() if response.status_code == 200 else {} return response
2. 验证Access Token的权限和上下文
- 用jwt.ms解码你的access_token,检查
scp字段是否包含User.Read权限(调用/me端点至少需要这个委托权限)。 - 确认这个token是用户令牌:应用令牌调用
/me会直接报错,因为没有关联的用户上下文。你直接访问时用的是用户身份授权,所以能成功,但代码里如果误用了应用令牌就会触发Access Denied。
3. 不要禁用SSL验证(verify=False)
虽然你加了verify=False绕过证书检查,但某些企业防火墙或代理会拦截这类不安全的请求,反而导致权限被拒。开发环境如果有证书问题,可以指定本地CA证书路径,生产环境一定要移除这个参数。
4. 检查Azure AD应用注册的权限配置
如果你的token是通过Azure AD应用注册获取的,要确认:
- 应用已经添加了
User.Read的委托权限 - 该权限已经获得管理员同意(如果是租户级别的应用场景)
如果以上步骤排查后还是有问题,可以把token解码后的scp、tid字段(敏感信息打码)和响应的完整错误消息贴出来,方便进一步定位问题。
内容的提问来源于stack exchange,提问作者Parashuram
相关产品推荐
相关产品推荐

