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

桌面Python脚本对接Microsoft Graph API:本地无固定IP认证方案咨询

适用于本地Windows Python脚本的Microsoft Graph API认证方案

针对你的场景,推荐两种无需Web服务或固定IP的认证方式,以下是具体实现细节:

一、设备代码流(推荐)

这是最适合无固定IP、无Web服务场景的认证方式,通过引导用户在任意浏览器中完成登录授权,无需本地服务接收令牌。

应用注册配置

  1. 登录Azure AD应用注册门户,找到你的应用
  2. 进入「认证」页面,点击「添加平台」,选择「移动和桌面应用」
  3. 勾选「https://login.microsoftonline.com/common/oauth2/nativeclient」作为重定向URI(该URI是公共客户端的默认值)
  4. 确保应用的「支持的账户类型」设置为公司内部账户(对应你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:01:25