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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:05:10