如何在Python中实现MS Project Online OData接口的NTLM认证?
解决Python访问MS Project Online OData API的NTLM认证问题
核心原因
MS Project Online(云端版)的OData API不支持传统NTLM认证,它依赖Azure AD的OAuth 2.0现代身份验证体系。你用浏览器和Power BI能成功获取数据,是因为它们自动触发了Azure AD的认证流程,而非原生NTLM。
无需Azure应用注册的可行方案
如果不想在Azure门户注册应用,可以使用用户名密码流(ROPC),直接用你的AD账号密码获取访问令牌,无需额外应用注册(注意:此方式不支持开启MFA的账号,且需要租户允许该流程)。
实现步骤
- 安装依赖库:
pip install requests msal
- 编写Python脚本:
import requests import msal # 配置参数 tenant_id = "你的租户ID(可填租户域名,如company.de)" client_id = "00000003-0000-0ff1-ce00-000000000000" # 微软内置的Power BI客户端ID,无需注册 username = "你的AD账号,格式如prename.lastname@company.de" password = "你的账号密码" api_url = "https://mycompany.sharepoint.com/sites/myprojectinstance/_api/ProjectData/" # 获取访问令牌 authority = f"https://login.microsoftonline.com/{tenant_id}" scope = ["https://mycompany.sharepoint.com/sites/myprojectinstance/_api/ProjectData/.default"] app = msal.PublicClientApplication(client_id, authority=authority) result = app.acquire_token_by_username_password(username, password, scopes=scope) if "access_token" in result: # 发起API请求 headers = { "Authorization": f"Bearer {result['access_token']}", "Accept": "application/json;odata=verbose" } response = requests.get(api_url, headers=headers) response.raise_for_status() # 抛出HTTP错误便于排查 print(response.json()) else: print(f"令牌获取失败: {result.get('error_description')}")
为什么NTLM认证无效
云端的MS Project Online已完全迁移至Azure AD身份验证框架,传统NTLM是本地AD的认证方式,云端服务不再接受直接的NTLM请求。
注意事项
- 若你的账号开启了MFA(多因素认证),ROPC流无法使用,必须注册Azure应用并采用交互式认证流程。
- 需确保租户管理员已允许ROPC认证流(默认可能禁用,需在Azure AD的身份验证方法中配置)。
内容的提问来源于stack exchange,提问作者ediordna
相关产品推荐
相关产品推荐

