Я не могу перечислить события в календаре через MS Graph API: вызовы приводят к «Отказано в доступе». Переключение на необработанный HTTP также приводит к ошибке 403. Однако я могу создать событие через POST в конечную точку /events.
Это код, который я выполняю:
$tenant = '<SNIP>'
$client_id = '<SNIP>'
$client_secret = '<SNIP>'
$scope = [System.Web.HttpUtility]::UrlEncode('https://graph.microsoft.com/.default')
$url = "https://login.microsoftonline.com/$tenant/oauth2/v2.0/token"
$Body = "client_id=$client_id&scope=$scope&client_secret=$client_secret&grant_type=client_credentials"
$response = Invoke-RestMethod $url -Method Post -Body $Body -Headers @{'Content-Type'='application/x-www-form-urlencoded'}
$token = $response.access_token
Connect-MgGraph -AccessToken $token
Get-MgUserEvent -UserId '17160c5f-dd86-46cc-92b8-54d6e94861e6'
Выход:
.\Calendar.ps1
Welcome To Microsoft Graph!
Get-MgUserEvent : Access is denied. Check credentials and try again.
In C:\Users\SYSTOLA-rk\Calendar.ps1:15 Zeichen:1
+ Get-MgUserEvent -UserId '17160c5f-dd86-46cc-92b8-54d6e94861e6'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: ({ UserId = 1716..., Property = }:<>f__AnonymousType39`7) [Get-MgUserEvent_List1], RestException`1
+ FullyQualifiedErrorId : ErrorAccessDenied,Microsoft.Graph.PowerShell.Cmdlets.GetMgUserEvent_List1
Вот разрешения в Azure, настроенные для приложения (мне не хватает репутации для публикации изображений): Разрешения приложения
Не Invoke-RestMethod
выдает ошибку, а Get-MgUserEvent
ошибается. Тело правильно для аутентификации приложения, а фигурные скобки создают коллекцию заголовков, а не массив, так что это также правильно. В любом случае токен приобретается и может быть использован для некоторых вещей. Но доступ к календарю запрещен.
Возможно ли, что существует политика доступа к приложениям, которая ограничивает доступ?
Я не создал ни одного. Существуют ли какие-либо политики, созданные по умолчанию в Exchange Online?
Читать далее: learn.microsoft.com/en-us/powershell/microsoftgraph/…
Нет политик по умолчанию, возможно, их создал кто-то другой? Единственный способ воспроизвести ошибку — удалить разрешение, но конфигурация в вашем образе должна работать (требуется только Calendars.Read
). Убедитесь, что токен, используемый в запросе ($error[0].Exception.RequestMessage.Headers.Authorization.Parameter
), действительно содержит разрешение
@scottwtang, с полученным токеном я могу создать событие, но не перечислить их, поэтому каким-то образом я получаю доступ только для записи.
@jdweng Я уже читал это пару раз. Если вы видите, что здесь не так, я с удовольствием выслушаю вас, но пока я не уверен, что именно вы имеете в виду.
В предоставленной мной ссылке говорится, что токен доступа добавляется в заголовок HTTP. Вы добавляете токен OATH2 в тело. Существует несколько способов добавления токенов. Возможно, вы используете метод, отличный от того, который требуется веб-странице. См.: learn.microsoft.com/en-us/graph/auth/… Ссылка от 20.12.22. Похоже, что это было недавно. Поэтому, если вы следуете более старому набору документации, он может быть устаревшим.
В верхней части страницы отображается запрос со следующими тегами: 1)client_id 2)scope 3)code 4)redirect_url 5)grant_type 6)client_secret В вашем запросе отсутствует "code" Код выглядит так, как будто это токен. У вас есть токен в качестве параметра, который, вероятно, был изменен, потому что он менее безопасен.
@jdweng Он использует модуль PowerShell, который действует как оболочка для API. Вы можете видеть, что он передает токен только при вызове командлета Connect-MgGraph
, который, в свою очередь, автоматически передает токен любым дальнейшим вызовам API. А свойство code
используется только для потока authorization code
, который представляет собой делегированный поток, в котором участвует пользователь. ОП использует поток client credential
без пользователя. Код ОП работает нормально.
@scottwtang: Тогда почему оп опубликовал этот вопрос, если код работает? нет вызовов API для соединения. OP должен правильно вставить заголовок и тело HTTP. Как я уже сказал, похоже, что в MS Graph произошли изменения, чтобы сделать соединение более безопасным, и, возможно, CMDLET устарел.
@jdweng Код может работать нормально, если есть другая проблема, например, неправильные разрешения, примененные при регистрации приложения. Вы вообще пробовали запускать код? Потому что это работает нормально. Или приведите конкретный пример того, как, по вашему мнению, должен формироваться запрос
@RomanKuznetsov Мне удалось воспроизвести ошибку после добавления всех трех разрешений Calendar
, которые у вас есть. Мне удалось устранить ошибку, удалив разрешение Calendars.ReadBasic.All
@scottwtang Да! это работает! Большое спасибо! Я бы не подумал, что разрешение «ReadBasic» будет мешать потоку. Если вы создадите ответ, я могу приписать вам успешно отвеченные вопросы.
@jdweng Как указал scottwtang, это была проблема с разрешением, но сам поток был так называемым потоком приложений, который представляет собой подход без пользователя, поэтому он может выглядеть иначе, чем вы ожидали.
Проблема, как мы обнаружили, заключается в том, что разрешение Calendars.ReadBasic.All
вызывало конфликт с другими разрешениями Calendar
. Удаление этого разрешения устранило ошибку
Согласно веб-сайту MS, в вашем теле отсутствует какой-то параметр: learn.microsoft.com/en-us/graph/auth/auth-concepts . Для массива я использую круглые скобки вместо фигурных скобок: @(.........) не @{..............}