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

使用SharePoint Python API+客户端凭据访问MS365文件遇401错误

解决SharePoint应用凭据认证401未授权问题

1. 修正站点URL指向

你代码中使用的site_url是根站点地址https://MYDOMAIN.sharepoint.com/,但你的应用是在engineering子站点注册的,权限也分配给该子站点,需将URL修改为子站点地址:https://MYDOMAIN.sharepoint.com/sites/engineering。根站点未给该应用授权,会导致认证失败。

2. 核对权限作用域与分配范围

你配置的权限作用域是http://sharepoint/content/sitecollection/web,对应站点集下的单个子站点,需确认:

  • 在appinv.aspx分配权限时,是否选择了engineering对应的站点集?
  • 若目标是访问OneDrive文件,需调整作用域:
    • 访问站点文档库:可保留原作用域但确保站点URL正确,或细化为http://sharepoint/content/sitecollection/web/list(针对特定文档库)。
    • 访问个人OneDrive:需使用http://sharepoint/content/user作用域,同时在Azure AD中给应用分配Files.Read.All或Sites.Read.All的应用权限(此为Azure AD层面权限,非传统SharePoint应用权限)。

3. 确认权限已被管理员批准

在appinv.aspx提交权限请求后,必须由站点管理员手动批准权限。进入engineering站点的/_layouts/15/appinv.aspx,找到你的应用,检查权限状态是否为已批准。

4. 调整代码认证方式并检查库版本

确保使用最新版office365 Python库,旧版本可能存在应用凭据认证bug。尝试替换认证方式:

from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.client_context import ClientCredential

client_id = "..."
client_secret = "..."
site_url = "https://MYDOMAIN.sharepoint.com/sites/engineering"

client_credentials = ClientCredential(client_id, client_secret)
ctx = ClientContext(site_url)
ctx.authenticate(client_credentials)  # 改用authenticate方法显式认证
web = ctx.web
ctx.load(web)
ctx.execute_query()
print("Web title: {0}".format(web.properties['Title']))

5. 明确OneDrive文件的访问路径

根据文件位置调整访问逻辑:

  • 站点文档库(团队OneDrive):文件路径一般为/sites/engineering/Shared Documents/xxx.xlsx,需先获取对应文档库,再定位文件。
  • 个人OneDrive:站点URL需改为https://MYDOMAIN-my.sharepoint.com/personal/user_mydomain_com,同时确保应用已获取个人OneDrive相关权限。

替代方案:改用Azure AD应用权限

若传统SharePoint应用权限配置繁琐,可直接在Azure AD注册应用,分配Sites.Read.All或Files.Read.All的应用权限(非委托权限),再用ClientCredential认证,这种方式更适配跨站点/OneDrive的访问场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:22:41