Проблема в том, что ваш токен не имеет правильной области действия. Чтобы иметь доступ к общим календарям, вам понадобится Calendars.Read.Shared
(или Calendars.ReadWrite.Shared
). То, как вы добавляете эту область в свой токен, зависит от того, где вы зарегистрировали приложение (что отвечает на ваш первый вопрос!)
Имеет ли значение, где и как приложение было зарегистрировано?
Да, это важно. Оба метода будут работать, но то, где вы регистрируетесь, влияет на то, как вы запрашиваете авторизацию и токены. Кроме того, приложения, зарегистрированные на портале управления Azure, могут аутентифицировать только пользователей Office 365, но не пользователей Outlook.com. Подробнее об этом в №2.
Имеет ли значение, какой URL для аутентификации мы используем?
Да! Используемый URL напрямую связан с местом, где вы зарегистрировали свое приложение. Я расскажу об этом ниже.
Разрешения области действия приложения и разрешения делегированной области - имеет ли значение, какие из них мы настроили в приложении? Будет ли наша желаемая функциональность работать с делегированными разрешениями?
Да, это важно. Разрешения приложения предоставляются приложению, а для API Outlook они являются глобальными для всей организации. Таким образом, если вы предоставите приложение Mail.Read
, оно сможет читать почту для всех пользователей в организации. Приложение действует как само по себе и не аутентифицирует пользователя. Из-за этого метод аутентификации требует сертификата вместо секрета клиента. Этот метод предназначен для приложений типа демона. Скорее всего, вам нужны делегированные разрешения, поскольку вы хотите аутентифицировать пользователей, а затем предоставлять им доступ только к тем другим почтовым ящикам / календарям, которые им разрешено просматривать.
Влияют ли каким-либо образом разрешения AD на разрешения пользователя в приложении?
Ну да, в том смысле, что если вы включите область .Shared
в свои разрешения, то, к чему у пользователя есть доступ, будет установлено, чем другие пользователи поделились с ним (и это связано с AD).
Как добавить общую область
Как я сказал выше, это имеет значение, как вы зарегистрировали свое приложение.
Портал управления Azure
Приложения, зарегистрированные на портале управления Azure, используют версию «v1» реализации OAuth2 в Azure. В рамках этой модели вы должны указать разрешения для своего приложения «заранее» при регистрации самого приложения. Чтобы добавить общее разрешение, вам необходимо изменить регистрацию приложения на портале. Разрешения отображаются на портале как «Чтение пользовательских и общих календарей» (для Calendars.Read.Shared
) и «Чтение и запись пользовательских и общих календарей» (для Calendars.ReadWrite.Shared
).
Если ваше приложение зарегистрировано здесь, вы ДОЛЖНЫ использовать конечные точки аутентификации и токена v1:
https://login.microsoftonline.com/common/oauth2/authorize
https://login.microsoftonline.com/common/oauth2/token
Кроме того, в схеме v1, если вы добавляете новые области в свою регистрацию приложения, вы ДОЛЖНЫ повторно отправить пользователя. В противном случае при следующем входе в ваше приложение они получат те же разрешения, что и раньше. Для этого при отправке пользователей в конечную точку авторизации добавьте параметр prompt=consent
в URL авторизации.
Портал регистрации приложений
Зарегистрированные здесь приложения используют реализацию Azure v2 и получают несколько преимуществ. Во-первых, вы можете аутентифицировать учетные записи Microsoft (Outlook.com), а также пользователей Office 365. Во-вторых, добавление областей не требует изменения регистрации вашего приложения. И, наконец, вам не нужно вручную повторно отправлять пользователей, конечная точка аутентификации обнаружит изменение и запросит вас.
Зарегистрированные здесь приложения используют конечные точки аутентификации и токена v2:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize
https://login.microsoftonline.com/common/oauth2/v2.0/token
Области действия указываются в параметре URL scope
в конечной точке аутентификации. Итак, чтобы добавить общие области, вы просто замените существующие Calendars.Read
и / или Calendars.ReadWrite
эквивалентом .Shared
.
person
Jason Johnston
schedule
26.01.2017