使用office365-rest-python-api从SharePoint下载文件遇认证问题求助
一、UserCredential认证报错:ValueError: Cannot get binary security token from https://login.microsoftonline.com/extSTS.srf
该错误源于旧式认证机制不兼容或被禁用,排查方向:
- 租户是否禁用旧式认证:SharePoint Online默认禁用依赖ws-trust协议的Legacy Auth,若租户全局开启禁用策略,UserCredential方式直接失效,建议改用OAuth2体系的认证方式(如ClientCredential、证书认证)。
- 用户账号是否启用MFA:若账号开启多重身份验证,仅通过用户名+密码的UserCredential方式无法完成认证,需使用支持MFA的流程(如设备代码流)。
二、ClientCredential认证报错:Forbidden 403 Error
403错误核心是应用权限不足或配置未生效,补充以下配置步骤:
- 授予管理员同意:在Azure AD应用的API权限页面,添加SharePoint的应用权限(注意是应用权限,而非委托权限)后,必须点击「授予管理员同意」按钮,否则权限无法实际生效。
- 确认权限范围:针对文档库读取需求,需添加
Sites.Read.All或更具体的Sites.ReadWrite.All应用权限,避免使用仅适用于用户上下文的委托权限。 - 授予站点级权限:若仅需访问特定站点,除Azure AD全局权限外,还需在目标SharePoint站点中给应用授予权限,可通过PowerShell执行:
Connect-PnPOnline -Url https://yourtenant.sharepoint.com/sites/yoursite -Interactive Set-PnPAppPermission -AppId <你的ClientID> -PermissionLevel "Read" -Scope Site - 验证凭据有效性:检查Client Secret是否未过期、复制时无多余空格;确认Client ID与Azure AD应用ID完全匹配。
- 核对文档库路径:代码中
"Shared Documents/Documents"需确保是目标站点下的正确服务器相对路径,可通过SharePoint站点的文档库属性确认。
代码优化提示
原代码中get_folder_by_server_relative_path后已执行get().execute_query(),后续重复ctx.load(web)和execute_query()属于冗余操作,可简化为:
client_credentials = ClientCredential(f'{client_id}',f'{client_secret}') ctx = ClientContext(url).with_credentials(client_credentials) # 获取文件夹并加载关联的文件、子文件夹属性 folder = ctx.web.get_folder_by_server_relative_path("Shared Documents/Documents").expand(["Files", "Folders"]).get().execute_query() # 单独获取站点标题 web = ctx.web.get().execute_query() print("Web title: {0}".format(web.properties['Title']))
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

