设计
目标
获取给定用户的日历事件。
要求
- 应用程序应有权访问 MS Graph API。
- 应用程序应像守护进程/后台进程一样运行,而不依赖于用户的登录。
- 应用程序应有权访问 Azure Active Directory (AAD) 中最少数量的用户数据。
- 应用程序应该能够获取用户的日历事件并创建它们。
实现/设置
- 履行 (1) Azure(企业)应用程序已按照描述创建 here .
- 启用 (2) 客户端凭据流与
应用程序权限设置
一起使用 - 会见 (3) 个
安全组
- 如所述 here - 由有限数量的用户创建,并具有包含相关权限的相关策略
(请参阅 here )。该群组后来连接到应用程序 this说明。 - 按照操作 here 的要求实现 (4)
Calendar.Read
和Calendar.ReadWrite
和 here已添加到上一设置步骤中提到的策略中。
测试
使用了两个 HTTP 请求:一个用于获取 token ,另一个用于读取事件。
- 来自
Identity Platform
的 token 请求
curl --location --request POST 'https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token' \
--data-raw 'client_id=<APPLICATION_TOKEN>&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=<APPLICATION_SECRET>&grant_type=client_credentials'
检查 token 后here我看到它包含所需的权限:
"roles": [
"Calendars.Read",
"Calendars.ReadWrite"
]
- 从
Graph API
获取日历事件的请求
curl --location --request GET 'https://graph.microsoft.com/v1.0/users/<USER_ID>/calendar/events' \
--header 'Authorization: Bearer <TOKEN>'
导致以下错误:
{
"error": {
"code": "ResourceNotFound",
"message": "User not found",
"innerError": {
"date": "2022-02-08T08:25:39",
"request-id": "bfaca1f9-e79b-491c-8d75-5a62317e299b",
"client-request-id": "bfaca1f9-e79b-491c-8d75-5a62317e299b"
}
}
}
用户 ID 来 self 在 Azure 租户的 Azure Active Directory 详细信息中找到的帐户。添加其他用户后,我仔细检查了这一点。
询问前调查
This问题看起来最接近我的情况,因为它使用客户端凭据身份验证流程。但它对 AAD 中的所有用户使用全局权限,而我们使用带有安全组
的更细粒度的方法。它还显示了不同的错误“无法发现资源。”
与我的情况下的“找不到用户”
。
最佳答案
为了调用/{user-id}/calendar/events 工作,如果您使用守护程序应用程序的客户端凭据,用户必须在 Exchange Online 上拥有邮箱。
此外,似乎无法将许可证分配给 guest 帐户(在本例中为个人帐户),因此用户帐户永远无法访问日历服务(o365 在线交换的一部分),因此无法检索日历个人账户信息。
请引用我在Q&A中类似的回答详细说明。
关于azure - "User not found"用于具有客户端凭据身份验证流程的 Azure 企业应用安全组中的 Graph API 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71032554/