//如何获得不同的用户/会议室日历活动?
我们正在尝试使用图形REST API来获取另一个用户的日历事件(已通过身份验证的用户的共享日历)或会议室(应该是具有共享日历的Active Directory用户,以便组织内的所有用户)。
我们仍然得到"禁止"响应。
我们可以成功获取用户(他自己)经过身份验证的日历活动。
我们还可以获取经过身份验证的用户以及其他用户(用户通过身份验证为John.Doe@company.com并获取elise@doe.company.com的用户详细信息)的用户详细信息,但我们无法获取有关详细信息。会议室用户,即使它应该是我们AD中的普通用户。
我们尝试设置所有委托甚至应用权限范围,没有任何帮助。
示例: var endpoint =" https://graph.microsoft.com/v1.0/users/" + userId +" / calendarView&#34 ;;
有没有办法检索这些信息?
答案 0 :(得分:1)
问题是您的令牌没有正确的范围。为了能够访问共享日历,您需要Calendars.Read.Shared
(或Calendars.ReadWrite.Shared
)。如何将该范围纳入您的令牌取决于您注册应用程序的位置(这可以回答您的第一个问题!)
申请注册的位置和方式是否重要?
是的,这很重要。这两种方法都有效,但您注册的位置会影响您请求授权和令牌的方式。此外,在Azure管理门户中注册的应用程序只能验证Office 365用户,而不能验证Outlook.com用户。更多关于#2的内容。
我们使用的身份验证网址是否重要?
是的!您使用的网址与您注册应用的地点直接相关。我打算在下面打破这个。
应用范围权限与委派范围权限 - 我们在应用程序中设置了哪些权限?我们所需的功能是否可以使用委派权限?
是的,这很重要。应用程序权限授予应用程序,对于Outlook API,这些权限对整个组织是全局的。因此,如果您授予应用Mail.Read
,它可以读取组织中所有用户的邮件。该应用程序充当自身,不会对用户进行身份验证。因此,auth方法需要证书而不是客户端密钥。此方法适用于守护程序类型的应用程序。您很可能需要委派权限,因为您要对用户进行身份验证,然后授予他们访问权限,以便他们可以查看这些权限。
AD权限是否会以某种方式影响用户在应用程序中的权限?
是的,从某种意义上说,如果您在权限中包含.Shared
范围,那么用户可以访问的内容是由其他用户与他们共享的内容设置的(这与AD绑定)。 / p>
如何添加共享范围
正如我上面所说,这对您注册应用的方式很重要。
Azure管理门户
Azure管理门户中注册的应用程序使用Azure的OAuth2实施的“v1”版本。在此模型下,您必须在应用注册本身“预先”指定应用的权限。要添加共享权限,您必须在门户中修改应用程序注册。权限在门户中显示为“读取用户和共享日历”(适用于Calendars.Read.Shared
)和“读写用户和共享日历”(适用于Calendars.ReadWrite.Shared
)。
如果你的应用是在这里注册的,那么你必须使用v1 auth和token端点:
https://login.microsoftonline.com/common/oauth2/authorize
https://login.microsoftonline.com/common/oauth2/token
此外,根据v1方案,如果您在应用注册中添加新范围,则必须让用户重新同意。否则,下次他们登录您的应用时,他们将获得之前相同的权限。为此,在将用户发送到授权端点时,请在授权URL中添加prompt=consent
参数。
应用程序注册门户
此处注册的应用使用v2 Azure实施并获得一些好处。首先,您可以验证Microsoft帐户(Outlook.com)以及Office 365用户。其次,添加范围不需要修改您的应用注册。最后,您不必手动重新同意用户,auth端点将检测到更改并提示您。
此处注册的应用使用v2身份验证和令牌端点:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize
https://login.microsoftonline.com/common/oauth2/v2.0/token
范围在auth端点的scope
URL参数中指定。因此,要添加共享范围,您只需将现有的Calendars.Read
和/或Calendars.ReadWrite
替换为.Shared
等效范围。