使用SharePoint Python API+客户端凭据访问MS365文件遇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应用权限)。
- 访问站点文档库:可保留原作用域但确保站点URL正确,或细化为
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
相关产品推荐
相关产品推荐

