通过PySpark读取SharePoint列表数据遇403禁止访问问题求助
核心原因
浏览器访问依赖交互式认证(或已有缓存凭证),但requests.get默认不带SharePoint认可的服务端认证凭证,导致权限校验失败。以下分两种场景给出解决代码及注意事项:
场景1:SharePoint Online(Azure AD托管)
需通过Azure AD应用注册获取服务主体凭证,以OAuth2方式请求访问令牌。
前置准备
- 在Azure AD中注册应用,记录
租户ID、客户端ID、客户端密钥。 - 为应用分配SharePoint权限(如
Sites.Read.All),并完成管理员同意。 - 确保应用对应的服务主体已被授予目标列表的读取权限(可添加到站点读者组)。
参考代码
import requests from azure.identity import ClientSecretCredential from pyspark.sql import SparkSession # 替换为你的配置信息 TENANT_ID = "your-tenant-id" CLIENT_ID = "your-app-client-id" CLIENT_SECRET = "your-app-client-secret" SHAREPOINT_SITE_URL = "https://yourtenant.sharepoint.com/sites/your-site-name" LIST_NAME = "your-list-name" # 获取OAuth2访问令牌 credential = ClientSecretCredential( tenant_id=TENANT_ID, client_id=CLIENT_ID, client_secret=CLIENT_SECRET ) scope = f"{SHAREPOINT_SITE_URL}/.default" token = credential.get_token(scope) # 构造SharePoint REST API端点 list_api_url = f"{SHAREPOINT_SITE_URL}/_api/web/lists/getByTitle('{LIST_NAME}')/items" # 发送认证请求 headers = { "Authorization": f"Bearer {token.token}", "Accept": "application/json;odata=verbose" } response = requests.get(list_api_url, headers=headers) # 转换为Spark DataFrame if response.status_code == 200: list_data = response.json()["d"]["results"] spark = SparkSession.builder.appName("SharePointOnlineReader").getOrCreate() df = spark.createDataFrame(list_data) df.show() else: print(f"请求失败:状态码{response.status_code},响应内容{response.text}")
场景2:SharePoint On-Premise(本地部署)
通常使用NTLM认证,需借助requests_ntlm库实现服务账户的凭证传递。
前置准备
- 确保服务账户已被添加到目标站点的读者组,拥有列表读取权限。
- 安装依赖库:
pip install requests_ntlm
参考代码
import requests from requests_ntlm import HttpNtlmAuth from pyspark.sql import SparkSession # 替换为你的配置信息 SHAREPOINT_SITE_URL = "http://your-onprem-sharepoint/sites/your-site-name" LIST_NAME = "your-list-name" SERVICE_ACCOUNT = "domain\\service-account-name" ACCOUNT_PASSWORD = "service-account-password" # 构造REST API端点 list_api_url = f"{SHAREPOINT_SITE_URL}/_api/web/lists/getByTitle('{LIST_NAME}')/items" # 发送NTLM认证请求 response = requests.get( list_api_url, auth=HttpNtlmAuth(SERVICE_ACCOUNT, ACCOUNT_PASSWORD), headers={"Accept": "application/json;odata=verbose"} ) # 转换为Spark DataFrame if response.status_code == 200: list_data = response.json()["d"]["results"] spark = SparkSession.builder.appName("OnPremSharePointReader").getOrCreate() df = spark.createDataFrame(list_data) df.show() else: print(f"请求失败:状态码{response.status_code},响应内容{response.text}")
常见排查点
- 权限校验:确认服务主体/账户的权限已正确配置,且无继承限制。
- URL准确性:站点URL、列表名称需完全匹配(注意大小写)。
- 认证方式匹配:Online用OAuth2,On-Premise用NTLM,不可混用。
内容的提问来源于stack exchange,提问作者user23510984
相关产品推荐
相关产品推荐

