使用Office365-REST-Python-Client下载SharePoint文件遇401未授权错误求助
问题详情
office365.runtime.client_request_exception.ClientRequestException: (None, None, "401 Client Error: Unauthorized for url: https://domain.sharepoint.com/sites/test/_api/Web/getFileByServerRelativePath(DecodedUrl='%2Fsites%2Ftest%2FShared%20Documents%2FSample_Compliance_content.pdf')?$select=ServerRelativePath,Id")
已完成的前置操作:
- 注册Microsoft 365开发者计划
- 在SharePoint创建站点并上传目标文档
- 尝试使用Office365-REST-Python-Client下载文档
- 按照官方文档完成授权配置,步骤为:登录Azure门户→进入Azure Active Directory→应用注册→选择对应应用→获取客户端ID→在「证书和密码」页获取/创建客户端密钥
代码相关情况:
- 使用
ClientCredential传入客户端ID和客户端密钥(非密钥ID),结合ClientContext发起请求 - 目标为下载SharePoint站点中的
Sample_Compliance_content.pdf文件 - 执行时触发上述401未授权错误
排查与修复方案
1. 检查应用权限配置
确保Azure应用注册中已添加正确的SharePoint应用权限并完成管理员同意:
- 进入应用注册的「API权限」页面
- 点击「添加权限」,选择「SharePoint」或「Microsoft Graph」
- 选择应用权限(而非委托权限),按需选择
Sites.Read.All(只读需求)或Sites.FullControl.All(读写需求),遵循最小权限原则 - 点击「授予管理员同意」(需全局管理员权限)
2. 验证客户端密钥有效性
- 确认代码中使用的是客户端密码的**「值」**(创建时显示的字符串,仅显示一次),而非「密钥ID」
- 检查密钥是否过期,若过期则重新生成客户端密钥并更新代码中的值
3. 确认站点URL与文件路径准确性
- 确保代码中的站点URL(
https://domain.sharepoint.com/sites/test)无拼写错误 - 验证文件的服务器相对路径:在SharePoint中打开目标文件,查看「详情」中的路径,确保代码中
DecodedUrl对应的编码路径与实际一致(比如空格需编码为%20)
4. 确认租户ID配置(若需)
部分场景下,使用ClientCredential需要指定租户ID,确保代码中正确配置:
from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential tenant_id = "你的租户ID" client_id = "你的客户端ID" client_secret = "你的客户端密钥" site_url = "https://domain.sharepoint.com/sites/test" # 初始化上下文,若需指定租户则传入tenant_id ctx = ClientContext(site_url).with_credentials(ClientCredential(client_id, client_secret, tenant_id))
5. 授予应用站点级权限
如果仅需访问特定站点,可直接在SharePoint站点中授权:
- 进入站点「设置」→「站点权限」→「高级权限设置」
- 点击「授予权限」,添加应用程序(通过客户端ID搜索),并分配成员或所有者权限
内容的提问来源于stack exchange,提问作者Abhay Katiyar
相关产品推荐
相关产品推荐

