如何用Python通过Azure应用注册从SharePoint Online指定站点下载文件及认证疑问
可行方案与实现说明
1. 特定站点权限的配置
完全可以实现仅授予Azure应用对单个SharePoint站点的访问权限,无需全站点或租户级权限:
- 在Azure AD应用注册中添加
Sites.Selected应用权限(注意是「应用权限」而非「委派权限」) - 通过Microsoft Graph API向目标站点单独授予该应用的访问权限(如读取权限),完成后应用仅能访问此特定站点。
2. 认证方式:客户端ID+密钥完全可行
不是必须使用证书认证,客户端ID与密钥(客户端密码)的方式可以正常工作。之前未生效大概率是权限配置遗漏或代码逻辑错误。
3. Python实现示例
使用Microsoft Graph SDK实现文件下载:
安装依赖
pip install msgraph-core python-dotenv requests
代码示例
from msgraph_core import GraphClient from azure.identity import ClientSecretCredential import os import requests from dotenv import load_dotenv load_dotenv() # 配置参数 tenant_id = os.getenv('TENANT_ID') client_id = os.getenv('CLIENT_ID') client_secret = os.getenv('CLIENT_SECRET') site_id = "目标站点ID" # 可通过Graph API获取:GET /sites/{域名}:/{站点路径} drive_id = "站点文档库Drive ID" # 可通过GET /sites/{site_id}/drives获取默认文档库ID file_path = "/Shared Documents/目标文件.pdf" # 文件在文档库中的路径 # 创建认证凭证 credential = ClientSecretCredential( tenant_id=tenant_id, client_id=client_id, client_secret=client_secret ) # 初始化Graph客户端 graph_client = GraphClient(credential=credential) # 获取文件下载链接 file_res = graph_client.get(f"/sites/{site_id}/drives/{drive_id}/root:{file_path}") file_info = file_res.json() download_url = file_info['@microsoft.graph.downloadUrl'] # 下载并保存文件 with open("本地保存文件名.pdf", "wb") as f: f.write(requests.get(download_url).content)
4. 关键注意事项
- 必须完成站点权限授予(易遗漏步骤),通过Graph API发送请求:
POST /sites/{site_id}/permissions Content-Type: application/json { "roles": ["read"], "grantedToIdentities": [ { "application": { "id": "你的Azure应用客户端ID", "displayName": "应用名称" } } ] }
- 确保客户端密钥未过期,且在Azure应用注册中正确配置。
- 站点ID可通过Graph Explorer测试获取,比如执行
GET https://graph.microsoft.com/v1.0/sites/{你的域名}:/sites/{站点名称}。
内容的提问来源于stack exchange,提问作者Luis Simoes
相关产品推荐
相关产品推荐

