前言
对于拥有 Microsoft E5 开发人员或者商业订阅的用户来说,如何高效管理组织内的大量 OneDrive 空间一直是个痛点。传统的 Rclone 配置通常基于 "Delegated (委托)" 权限,需要定期(通常是90天)重新授权,且每个账号都需要单独配置,维护起来非常繁琐。
本文将介绍一种利用 Microsoft Graph API 的 Client Credentials (客户端凭据) 模式进行配置的方法。其核心优势在于:
- 长期有效:我们可以手动申请有效甚至长达 100 年的密钥,彻底告别 periodic re-authentication。
- 全组织通用:只需创建一个应用(App),即可通过修改
drive_id挂载组织内任意用户的 OneDrive,无需重复申请 API。 - 自动化友好:非常适合服务器端的自动化备份任务,因为不需要交互式登录。
⚠️ 必须注意的安全风险
本教程使用的权限是Files.ReadWrite.All(Application 级别)。这意味着获得此配置文件(Client ID 和 Secret)的人,实际上拥有读写该组织下所有用户 OneDrive 和 SharePoint 站点数据的最高权限。
- 请务必像保管银行密码一样保管您的
client_secret。- 严禁将此配置文件分发给不可信的第三方。
- 建议仅在您自己完全控制的服务器上使用此配置。
第一步:注册应用并获取租户 ID
- 使用管理员账号登录 Microsoft Entra 管理中心 (原 Azure AD):
https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView - 在“概览”页面,找到并复制 租户 ID (Tenant ID),保存备用。
- 点击左侧菜单的“应用注册” -> “新注册”。
- 名称:任意填写,例如
Rclone-Global。 - 受支持的账户类型:
- 推荐:选择第一项 “仅此组织目录中的帐户 (单租户)”。这是最标准且安全的做法。
- 备选:如果您在后续配置或使用某些特定第三方工具(如 AList/OpenList)遇到权限报错,可以尝试重新注册并选择第三项 “任何组织目录(任何 Microsoft Entra ID 租户)中的帐户和个人 Microsoft 帐户”,这通常具有更广泛的兼容性。
- 重定向 URI:留空即可。
- 点击“注册”。
- 注册完成后,在应用概览页面复制 应用程序(客户端) ID (Client ID) 和 对象 ID (Object ID),保存备用。
第二步:申请长期密钥
普通界面创建的密钥有效期最长通常只有 24 个月。我们可以通过 Graph API 绕过此限制,申请一个自定义有效期的密钥。
- 访问 Graph Explorer 并使用管理员账号登录:
https://developer.microsoft.com/zh-cn/graph/graph-explorer - 将请求方式从
GET改为POST。 - 在请求地址栏输入以下 URL(将其中的
{id}替换为您上一步复制的 对象 ID):https://graph.microsoft.com/v1.0/applications/{id}/addPassword - 在下方的 "Request body" (请求正文) 中输入以下 JSON:
{ "passwordCredential": { "displayName": "Rclone-LongTerm", "endDateTime": "2125-12-30T00:00:00Z" } }
(注:这里的endDateTime可以自定义,设为 100 年后基本等同于永久) - 如果这是您第一次使用 Graph Explorer,可能会提示权限不足。点击 "Modify permissions",搜索
Application.ReadWrite.All并点击 "Consent" 进行授权。 - 点击 Run query。
- 关键步骤:在下方的 "Response preview" (响应预览) 中,找到
secretText字段。立即复制并保存这个值,由于安全原因,它只显示一次,这就是您的 客户端密钥 (Client Secret)。
第三步:授予应用高等级权限
- 回到 Entra 管理中心,打开您刚刚注册的应用。
- 点击左侧“API 权限” -> “添加权限” -> “Microsoft Graph”。
- 选择 “应用程序权限” (Application permissions) *(注意:不是委托权限)*。
- 搜索并勾选以下权限:
Files.Read.AllFiles.ReadWrite.All
- 点击“添加权限”。
- 重要:添加完成后,权限状态会显示“未授予”。必须点击列表上方的 “代表 [您的组织名称] 授予管理员同意” 按钮,并确认。状态变为绿色的“已授予”才算成功。
第四步:获取目标用户的 Drive ID
虽然我们有了全局权限,但 Rclone 需要知道具体挂载哪个用户的网盘。我们需要获取该用户的 drive_id。
- 回到 Graph Explorer,这次用您想要挂载网盘的那个用户账号登录。
- 将请求方式改回
GET。 - 请求地址修改为:
https://graph.microsoft.com/v1.0/users/{userUPN}/drive
(将{userUPN}替换为目标用户的完整邮箱地址,例如admin@example.com) - 在 "Modify permissions" 中同意
Files.Read.All。 - 点击 Run query。
- 在响应结果中,找到
id字段(通常是一串长字符串)。这就是该用户的 drive_id。
第五步:编写 Rclone 配置文件
现在我们集齐了:
- 租户 ID (tenant_id)
- 客户端 ID (client_id)
- 客户端密钥 (client_secret)
- Drive ID (drive_id)
直接在您的 VPS 或电脑上编辑 rclone.conf 文件(或使用文本编辑器新建),填入以下内容:
[onedrive-user-a]
type = onedrive
driver = onedrive
# 您的租户 ID
tenant = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 您的应用程序(客户端) ID
client_id = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 您获取的长期密钥
client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 开启客户端凭据模式
client_credentials = true
# 账号类型通常为 business
drive_type = business
# 目标用户的 Drive ID
drive_id = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
如何添加第二个用户?
非常简单!您不需要重新注册应用,也不需要重新申请密钥。只需要重复“第四步”获取另一个用户的 drive_id,然后复制上面的配置段落,修改 [名称] 和 drive_id 即可:
[onedrive-user-b]
type = onedrive
... (tenant, client_id, client_secret 保持完全一致) ...
drive_id = 另一个用户的以b开头的drive_id
通过这种方式,您可以迅速为组织内的成百上千个账号建立索引或备份任务,极大地简化了运维成本。
参考来源:
