使用PHP从Microsoft Graph API获取AccessToken,同步Outlook 365日历至后台服务
实现Outlook 365日历事件同步到后台服务(无用户授权场景)
嘿,既然你已经完成了管理员权限审批,接下来就可以通过客户端凭证流(Client Credentials Flow)获取访问令牌,进而调用Microsoft Graph API来同步日历事件了。我给你梳理下具体的落地步骤:
1. 准备关键应用信息
首先确认你已经在Azure AD中完成了应用注册,务必存好这三个核心信息:
- 租户ID(Tenant ID):对应你的
mycompany.onmicrosoft.com租户标识 - 客户端ID(Client ID):应用注册时系统生成的唯一ID
- 客户端密钥(Client Secret):在应用注册的「证书和密码」板块创建的密钥(注意:密钥只显示一次,一定要妥善保存)
2. 获取Access Token
向Azure AD的令牌端点发送POST请求,就能拿到可用于调用Graph API的令牌。请求格式如下:
POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &client_id={client-id} &client_secret={client-secret} &scope=https://graph.microsoft.com/.default
这里的scope用https://graph.microsoft.com/.default,表示使用应用注册时管理员已批准的所有应用权限。
你也可以用curl命令快速测试:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&client_id=你的客户端ID&client_secret=你的客户端密钥&scope=https://graph.microsoft.com/.default" \ https://login.microsoftonline.com/你的租户ID/oauth2/v2.0/token
3. 调用Graph API同步日历事件
拿到access token后,就可以发起请求获取日历数据了。比如获取指定用户的日历事件:
GET https://graph.microsoft.com/v1.0/users/{用户ID或邮箱}/calendar/events Authorization: Bearer {你的access-token}
如果需要同步租户内所有用户的日历,可以先调用GET /users接口获取全量用户列表,再逐个请求他们的日历事件。
4. 重要注意事项
- 确保你的应用在Azure AD中被授予了应用权限(不是委托权限),比如
Calendars.Read或Calendars.ReadWrite,且已经完成管理员审批。 - 后台服务要安全存储客户端密钥和access token,避免泄露,推荐用Azure Key Vault这类工具管理敏感信息。
- 注意access token的过期时间(返回结果里的
expires_in字段,一般是3600秒),要在过期前主动刷新令牌。
内容的提问来源于stack exchange,提问作者Rodniko




