从不同用户(会议室)获取共享日历

Get shared calendar from different user(meeting room)

//如何获取不同的用户/会议室日历事件?

我们正在尝试使用图形 REST API 来获取另一个用户的日历事件(共享日历给经过身份验证的用户)或会议室(应该是一个 Active Directory 用户,其中的所有用户都共享日历组织)。

我们仍然收到 "Forbidden" 回复。

我们可以成功获取用户(他自己)经过身份验证的日历事件。

我们还可以获得经过身份验证的用户甚至另一个用户的用户详细信息(用户身份验证为 John.Doe@company.com 并且可以获得 elise@doe 的用户详细信息。company.com ) 但我们无法获取会议室用户的详细信息,即使它应该是我们 AD 中的普通用户。

我们尝试设置所有委托甚至应用权限范围,但没有任何帮助。

示例: var endpoint = "https://graph.microsoft.com/v1.0/users/"+userId+"/calendarView";

有没有办法检索这些信息?

问题是您的令牌没有正确的范围。要访问共享日历,您需要 Calendars.Read.Shared(或 Calendars.ReadWrite.Shared)。如何将该范围纳入您的令牌取决于您注册应用程序的位置(这回答了您的第一个问题!)

  1. 申请的注册地点或方式重要吗?

    是的,这很重要。这两种方法都可以,但您注册的位置会影响您请求授权和令牌的方式。此外,在 Azure 管理门户中注册的应用只能对 Office 365 用户进行身份验证,不能对 Outlook.com 用户进行身份验证。在 #2 中有更多相关信息。

  2. 我们使用什么身份验证 URL 重要吗?

    是的!您使用的 URL 与您注册应用程序的位置直接相关。我将在下面对此进行分解。

  3. 应用范围权限与委派范围权限 - 我们在应用程序中设置哪些权限重要吗?我们想要的功能是否可以使用委托权限?

    是的,这很重要。应用程序权限授予应用程序,对于 Outlook API,这些权限对整个组织都是全局的。因此,如果您授予应用程序 Mail.Read,它可以为组织中的所有用户读取邮件。该应用程序充当自己的角色,不会对用户进行身份验证。因此,auth 方法需要证书而不是客户端密码。此方法适用于 daemon-type 个应用。您很可能需要委派权限,因为您想要对用户进行身份验证,然后只允许他们访问那些允许他们查看的其他 mailboxes/calendars。

  4. AD 权限是否会以某种方式影响用户在应用程序中拥有的权限?

    是的,如果您在权限中包含 .Shared 范围,则用户有权访问的内容由其他用户与他们共享的内容设置(这与 AD 相关) .

如何添加共享范围

正如我上面所说,这对您注册应用程序的方式很重要。

Azure 管理门户

在 Azure 管理门户中注册的应用程序使用 "v1" 版本的 Azure OAuth2 实现。在这种模式下,您必须在应用程序注册本身上为您的应用程序指定权限 "up front"。要添加共享权限,您必须在门户中修改应用程序注册。权限在门户中显示为 "Read user and shared calendars"(对于 Calendars.Read.Shared)和 "Read and write user and shared calendars"(对于 Calendars.ReadWrite.Shared)。

如果您的应用已在此处注册,则您必须使用 v1 身份验证和令牌端点:

https://login.microsoftonline.com/common/oauth2/authorize
https://login.microsoftonline.com/common/oauth2/token

此外,在 v1 方案下,如果您在应用注册中添加新的范围,则必须征得用户的重新同意。否则,下次他们登录您的应用时,他们将获得与之前相同的权限。为此,在将用户发送到授权端点时,将 prompt=consent 参数添加到授权 URL.

申请注册门户

此处注册的应用程序使用 v2 Azure 实现并获得一些好处。首先,您可以验证 Microsoft 帐户 (Outlook.com) 以及 Office 365 用户。其次,添加范围不需要修改您的应用程序注册。最后,您不必手动重新同意用户,身份验证端点将检测到更改并为您提示。

在此处注册的应用使用 v2 身份验证和令牌端点:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize
https://login.microsoftonline.com/common/oauth2/v2.0/token

范围在身份验证端点的 scope URL 参数中指定。因此,要添加共享范围,您只需将现有的 Calendars.Read and/or Calendars.ReadWrite 替换为 .Shared 等价物。