如何实现Office 365 Server-to-Server集成并调用Microsoft Graph API?
可以实现Server-to-Server的Microsoft Graph集成
当然可以!这种不需要用户交互的服务端定时任务场景,正好适合用Microsoft Graph的**客户端凭据流(Client Credentials Flow)**来实现服务到服务的集成,完全不用依赖用户登录重定向的流程。下面给你一步步拆解实现方式:
1. 先在Azure AD中注册服务应用
- 登录Azure门户,注册一个单租户或多租户应用(根据你的组织需求选择)
- 给应用添加应用权限(注意是「应用权限」不是「委托权限」,因为没有用户参与交互),比如要读取文件元数据可以加
Files.Read.All,读取Groups/Teams信息加Group.Read.All,添加后必须由租户管理员完成管理员同意,否则API调用会失败 - 生成认证凭据:推荐用证书(安全性更高),也可以生成客户端密钥,后续用来获取访问令牌
2. 通过客户端凭据流获取访问令牌
你可以用Microsoft官方的身份认证库(比如Microsoft.Identity.Client)来简化令牌获取流程,以C#为例:
using Microsoft.Identity.Client; var scopes = new[] { "https://graph.microsoft.com/.default" }; var tenantId = "你的Office 365租户ID"; var clientId = "Azure AD中注册的应用ID"; var clientSecret = "你生成的客户端密钥"; // 如果用证书的话,这里换成证书相关配置 var confidentialClient = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}")) .Build(); // 获取应用级别的访问令牌 var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync(); var accessToken = authResult.AccessToken;
这里的https://graph.microsoft.com/.default表示使用你在应用注册时配置的所有应用权限。
3. 调用Microsoft Graph API获取文件元数据
拿到令牌后,就可以调用Graph API获取Groups/Teams的文件信息了,同样以C#为例(用Microsoft.Graph库):
using Microsoft.Graph; using System.Net.Http.Headers; var graphClient = new GraphServiceClient( new DelegateAuthenticationProvider((requestMessage) => { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); return Task.CompletedTask; })); // 示例:获取指定Team/Group下的所有文件元数据 var targetGroupId = "你要访问的Group/Team的ID"; var driveItems = await graphClient.Groups[targetGroupId].Drive.Root.Children .Request() .Select("id, name, createdDateTime, lastModifiedDateTime, size, webUrl") // 指定要获取的元数据字段 .GetAsync(); // 遍历处理获取到的文件信息 foreach (var item in driveItems) { Console.WriteLine($"文件名: {item.Name}"); Console.WriteLine($"大小: {item.Size} bytes"); Console.WriteLine($"最后修改时间: {item.LastModifiedDateTime}"); Console.WriteLine($"文件链接: {item.WebUrl}\n"); }
关键注意事项
- 应用权限必须经过租户管理员同意,个人账号无法完成这个操作
- 遵循最小权限原则:只给应用完成任务必需的权限,不要分配过高权限
- 定时任务的实现:可以用Windows任务计划、Linux Cron,或者云服务比如Azure Functions Timer Trigger来定期执行这段代码
- 安全性建议:优先使用证书代替客户端密钥,避免密钥泄露风险
内容的提问来源于stack exchange,提问作者hemil
相关产品推荐
相关产品推荐

