使用Office365-REST-Python-Client上传文件至SharePoint遇403,如何配置权限?
一、修正SharePoint传统应用注册(appregnew/appinv)的权限配置
你已通过_layouts/15/appregnew.aspx创建应用、_layouts/15/appinv.aspx信任应用,但权限配置可能存在以下问题:
确保权限XML包含App-Only策略及正确权限
在appinv.aspx的权限请求XML输入框中,必须开启应用独立权限并授予读写权限,示例XML:<AppPermissionRequests AllowAppOnlyPolicy="true"> <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="Write" /> </AppPermissionRequests>Scope:按需选择层级,网站集级别用http://sharepoint/content/sitecollection,网站级别用http://sharepoint/content/sitecollection/webRight:至少设为Write,需全权限可设为FullControl
验证权限授予状态
进入SharePoint站点的网站设置->应用程序权限,确认应用已被列出且权限匹配配置。若未显示,需重新执行appinv.aspx的信任操作。核对CLIENT_ID与CLIENT_SECRET
确保从appregnew.aspx复制的客户端ID和密钥完整无错,密钥为一次性生成,丢失需重新创建。
二、改用Azure AD应用注册(推荐,微软主流方案)
若传统方式无效,建议使用Azure AD应用注册,步骤如下:
注册Azure AD应用
- 登录Azure门户,进入Azure Active Directory->应用注册,点击新注册
- 填写名称,选择账户类型(推荐“任何组织目录中的账户”),重定向URI留空,完成注册
- 记录应用程序(客户端)ID(即代码中的
CLIENT_ID),在证书和密码中新建客户端密码,记录密码(即CLIENT_SECRET)
配置API权限
- 在应用注册的API权限页面,点击添加权限->选择SharePoint->选择应用权限
- 添加
Sites.ReadWrite.All权限,点击授予管理员同意(需全局管理员操作,否则权限不生效)
代码无需大幅调整
原认证逻辑可直接使用,确保SHAREPOINT_SITE_URL为站点完整URL(如https://your-domain.sharepoint.com/sites/your-site)
三、代码本身的小修正
你的上传代码存在参数错误:target_folder.files.upload的第一个参数应为SharePoint上的文件名,而非本地文件路径。修正后:
def upload_document_to_sharepoint(local_file_path, sharepoint_folder_path): import os from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential # 替换为你的实际参数 CLIENT_ID = "your-client-id" CLIENT_SECRET = "your-client-secret" SHAREPOINT_SITE_URL = "https://your-domain.sharepoint.com/sites/your-site" # Authenticate with SharePoint credentials = ClientCredential(CLIENT_ID, CLIENT_SECRET) ctx = ClientContext(SHAREPOINT_SITE_URL).with_credentials(credentials) # Get the target folder target_folder = ctx.web.get_folder_by_server_relative_url(sharepoint_folder_path) file_name = os.path.basename(local_file_path) # Open the local file in binary read mode with open(local_file_path, 'rb') as file_content: # 修正第一个参数为file_name uploaded_file = target_folder.files.upload(file_name, file_content.read()).execute_query() print(f"File '{file_name}' uploaded successfully to: {uploaded_file.serverRelativeUrl}")
四、排查验证步骤
- 用Postman测试权限:获取应用令牌后,调用
GET https://<site-url>/_api/web,返回200则权限生效,403则需重新检查配置 - 确认SharePoint站点未启用IP限制或其他安全策略阻止应用访问
- 若使用Azure AD应用,检查租户是否允许应用访问SharePoint资源
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

