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

通过PySpark读取SharePoint列表数据遇403禁止访问问题求助

解决PySpark中通过服务账户读取SharePoint列表403错误的方案

核心原因

浏览器访问依赖交互式认证(或已有缓存凭证),但requests.get默认不带SharePoint认可的服务端认证凭证,导致权限校验失败。以下分两种场景给出解决代码及注意事项:


场景1:SharePoint Online(Azure AD托管)

需通过Azure AD应用注册获取服务主体凭证,以OAuth2方式请求访问令牌。

前置准备

  1. 在Azure AD中注册应用,记录租户ID、客户端ID、客户端密钥。
  2. 为应用分配SharePoint权限(如Sites.Read.All),并完成管理员同意。
  3. 确保应用对应的服务主体已被授予目标列表的读取权限(可添加到站点读者组)。

参考代码

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库实现服务账户的凭证传递。

前置准备

  1. 确保服务账户已被添加到目标站点的读者组,拥有列表读取权限。
  2. 安装依赖库: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:37:46