Python访问SharePoint列表遇AADSTS50059认证错误求助
问题描述
尝试用Python访问SharePoint列表并导出为CSV文件时,认证环节触发如下错误:
('Error authenticating against Office 365. Error from Office 365:',
'AADSTS50059: No tenant-identifying information found in either the
request or implied by any provided credentials.')
已尝试两种认证方式,均触发相同错误,代码如下:
from config import config from shareplum import Site from shareplum import Office365 from shareplum.site import Version from requests_ntlm import HttpNtlmAuth from office365.runtime.auth.authentication_context import AuthenticationContext from office365.sharepoint.client_context import ClientContext base_path = config.config['sp_base_path'] username = config.config['sp_user'] password = config.config['sp_password'] ##Approach 1 # cred = HttpNtlmAuth('myusername@domain.com', 'Password') # site = Site('https://xxxxxx.sharepoint.com/logs/Lists/Logs%20Entries/All%20Items.aspx', auth=cred) ##Approach 2 # authcookie = Office365(base_path, username=username, password=password).GetCookies() # site = Site('https://xxxxxx.sharepoint.com/logs/Lists' ,version=Version.v365, authcookie=authcookie)
错误原因
AADSTS50059错误本质是请求未提供足够的租户识别信息,导致Office 365无法定位对应的认证租户。两种方式的具体问题:
- 方式1:HttpNtlmAuth适用于本地部署的SharePoint Server,云端SharePoint Online不支持该认证方式,因此无法完成租户认证。
- 方式2:使用的URL路径错误(
https://xxxxxx.sharepoint.com/logs/Lists不是有效站点根URL),且Office365实例初始化时可能未传入正确的租户根域名,导致无法识别租户。
解决方案
方案1:修正Shareplum认证逻辑
针对SharePoint Online,需使用正确的站点根URL初始化Office365实例,获取认证Cookie后再访问目标列表:
from config import config from shareplum import Site from shareplum import Office365 from shareplum.site import Version import csv # 替换为你的SharePoint站点根URL site_root_url = "https://xxxxxx.sharepoint.com/logs" username = config.config['sp_user'] password = config.config['sp_password'] # 获取认证Cookie(需传入租户根域名) auth_cookies = Office365("https://xxxxxx.sharepoint.com", username=username, password=password).GetCookies() # 连接到目标站点 site = Site(site_root_url, version=Version.v365, authcookie=auth_cookies) # 获取目标列表 target_list = site.List("Logs Entries") # 拉取列表数据 list_data = target_list.GetListItems() # 导出为CSV文件 with open("sharepoint_logs.csv", "w", newline="", encoding="utf-8") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=list_data[0].keys()) writer.writeheader() writer.writerows(list_data)
方案2:使用Office365 Python SDK完成认证与数据导出
借助官方SDK的UserCredential认证方式,确保站点URL和账号信息正确:
from config import config from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.user_credential import UserCredential import csv site_url = "https://xxxxxx.sharepoint.com/logs" username = config.config['sp_user'] password = config.config['sp_password'] # 初始化客户端上下文并完成认证 ctx = ClientContext(site_url).with_credentials(UserCredential(username, password)) # 获取目标列表 target_list = ctx.web.lists.get_by_title("Logs Entries") # 拉取列表项数据 list_items = target_list.get_items().execute_query() # 整理数据(过滤odata前缀的属性) export_data = [] for item in list_items: clean_item = {k: v for k, v in item.properties.items() if not k.startswith('odata')} export_data.append(clean_item) # 导出为CSV with open("sharepoint_logs.csv", "w", newline="", encoding="utf-8") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=export_data[0].keys()) writer.writeheader() writer.writerows(export_data)
关键注意事项
- 云端SharePoint Online不支持NTLM认证,请勿使用HttpNtlmAuth方式。
- 所有URL需使用SharePoint站点的根URL(如
https://xxx.sharepoint.com/sites/xxx),而非列表页面或片段路径。 - 认证账号需为完整的Azure AD账号格式(如
user@yourtenant.onmicrosoft.com),且具备目标站点和列表的访问权限。
内容的提问来源于stack exchange,提问作者Ven
相关产品推荐
相关产品推荐

