桌面Python脚本对接Microsoft Graph API:本地无固定IP认证方案咨询
适用于本地Windows Python脚本的Microsoft Graph API认证方案
针对你的场景,推荐两种无需Web服务或固定IP的认证方式,以下是具体实现细节:
一、设备代码流(推荐)
这是最适合无固定IP、无Web服务场景的认证方式,通过引导用户在任意浏览器中完成登录授权,无需本地服务接收令牌。
应用注册配置
- 登录Azure AD应用注册门户,找到你的应用
- 进入「认证」页面,点击「添加平台」,选择「移动和桌面应用」
- 勾选「https://login.microsoftonline.com/common/oauth2/nativeclient」作为重定向URI(该URI是公共客户端的默认值)
- 确保应用的「支持的账户类型」设置为公司内部账户(对应你的M365租户)
Python代码实现
使用微软官方的msal库完成认证,示例代码如下:
import msal import requests # 替换为你的应用信息 CLIENT_ID = "你的应用客户端ID" TENANT_ID = "你的公司租户ID" AUTHORITY = f"https://login.microsoftonline.com/{TENANT_ID}" # 按需添加所需权限,邮件发送和Excel编辑至少需要以下权限 REQUESTED_SCOPES = ["Mail.Send", "Files.ReadWrite"] # 初始化公共客户端应用 app = msal.PublicClientApplication(CLIENT_ID, authority=AUTHORITY) # 启动设备代码流 device_flow = app.initiate_device_flow(scopes=REQUESTED_SCOPES) if "user_code" not in device_flow: raise ValueError(f"初始化设备代码流失败: {device_flow.get('error_description')}") # 提示用户完成授权 print(device_flow["message"]) # 等待用户授权,获取访问令牌 auth_result = app.acquire_token_by_device_flow(device_flow) if "access_token" in auth_result: access_token = auth_result["access_token"] headers = {"Authorization": f"Bearer {access_token}"} # 示例1:发送邮件 mail_endpoint = "https://graph.microsoft.com/v1.0/me/sendMail" mail_data = { "message": { "subject": "Graph API测试邮件", "body": {"contentType": "Text", "content": "这是本地Python脚本发送的测试邮件"}, "toRecipients": [{"emailAddress": {"address": "recipient@yourcompany.com"}}] }, "saveToSentItems": "true" } mail_response = requests.post(mail_endpoint, json=mail_data, headers=headers) print(f"邮件发送状态: {'成功' if mail_response.status_code == 202 else '失败'}") # 示例2:编辑OneDrive中的Excel文件(替换为你的文件ID和工作表信息) excel_endpoint = "https://graph.microsoft.com/v1.0/me/drive/items/{your-file-id}/workbook/worksheets/Sheet1/range(address='A1')/values" excel_data = {"values": [["更新的测试内容"]]} excel_response = requests.patch(excel_endpoint, json=excel_data, headers=headers) print(f"Excel编辑状态: {'成功' if excel_response.status_code == 200 else '失败'}") else: print(f"认证失败: {auth_result.get('error_description')}")
二、用户名密码流(仅限特定场景)
该方式直接使用用户的邮箱和密码完成认证,无需用户手动操作,但存在安全性和兼容性限制:
- 仅适用于未启用MFA(多因素认证)的用户账户
- 不推荐在生产环境使用,存在密码泄露风险
应用注册配置
无需额外的重定向URI配置,只需确保应用已添加所需的委派权限。
Python代码实现
import msal import requests CLIENT_ID = "你的应用客户端ID" TENANT_ID = "你的公司租户ID" AUTHORITY = f"https://login.microsoftonline.com/{TENANT_ID}" REQUESTED_SCOPES = ["Mail.Send", "Files.ReadWrite"] USER_EMAIL = "your-account@yourcompany.com" USER_PASSWORD = "your-password" app = msal.PublicClientApplication(CLIENT_ID, authority=AUTHORITY) auth_result = app.acquire_token_by_username_password(USER_EMAIL, USER_PASSWORD, scopes=REQUESTED_SCOPES) if "access_token" in auth_result: access_token = auth_result["access_token"] # 后续API调用逻辑与设备代码流一致 else: print(f"认证失败: {auth_result.get('error_description')}")
注意事项
- 权限配置:在应用注册的「API权限」页面添加所需的委派权限,若权限标记为「需要管理员同意」,需由公司AD管理员提前授权
- 依赖安装:执行
pip install msal requests安装所需库 - 设备代码流支持MFA,是符合安全规范的首选方案
内容的提问来源于stack exchange,提问作者Alex Heuman
相关产品推荐
相关产品推荐

