Microsoft Graph «Отказано в доступе. Проверьте учетные данные и повторите попытку» в PowerShell

Я не могу перечислить события в календаре через 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, настроенные для приложения (мне не хватает репутации для публикации изображений): Разрешения приложения

Согласно веб-сайту MS, в вашем теле отсутствует какой-то параметр: learn.microsoft.com/en-us/graph/auth/auth-concepts . Для массива я использую круглые скобки вместо фигурных скобок: @(.........) не @{..............}

jdweng 16.02.2023 03:24

Не Invoke-RestMethod выдает ошибку, а Get-MgUserEvent ошибается. Тело правильно для аутентификации приложения, а фигурные скобки создают коллекцию заголовков, а не массив, так что это также правильно. В любом случае токен приобретается и может быть использован для некоторых вещей. Но доступ к календарю запрещен.

Roman Kuznetsov 16.02.2023 23:41

Возможно ли, что существует политика доступа к приложениям, которая ограничивает доступ?

scottwtang 16.02.2023 23:50

Я не создал ни одного. Существуют ли какие-либо политики, созданные по умолчанию в Exchange Online?

Roman Kuznetsov 17.02.2023 00:22

Читать далее: learn.microsoft.com/en-us/powershell/microsoftgraph/…

jdweng 17.02.2023 04:03

Нет политик по умолчанию, возможно, их создал кто-то другой? Единственный способ воспроизвести ошибку — удалить разрешение, но конфигурация в вашем образе должна работать (требуется только Calendars.Read). Убедитесь, что токен, используемый в запросе ($error[0].Exception.RequestMessage.Headers.Authorization.Pa‌​rameter), действительно содержит разрешение

scottwtang 17.02.2023 06:26

@scottwtang, с полученным токеном я могу создать событие, но не перечислить их, поэтому каким-то образом я получаю доступ только для записи.

Roman Kuznetsov 19.02.2023 12:50

@jdweng Я уже читал это пару раз. Если вы видите, что здесь не так, я с удовольствием выслушаю вас, но пока я не уверен, что именно вы имеете в виду.

Roman Kuznetsov 19.02.2023 12:54

В предоставленной мной ссылке говорится, что токен доступа добавляется в заголовок HTTP. Вы добавляете токен OATH2 в тело. Существует несколько способов добавления токенов. Возможно, вы используете метод, отличный от того, который требуется веб-странице. См.: learn.microsoft.com/en-us/graph/auth/… Ссылка от 20.12.22. Похоже, что это было недавно. Поэтому, если вы следуете более старому набору документации, он может быть устаревшим.

jdweng 19.02.2023 14:54

В верхней части страницы отображается запрос со следующими тегами: 1)client_id 2)scope 3)code 4)redirect_url 5)grant_type 6)client_secret В вашем запросе отсутствует "code" Код выглядит так, как будто это токен. У вас есть токен в качестве параметра, который, вероятно, был изменен, потому что он менее безопасен.

jdweng 19.02.2023 15:02

@jdweng Он использует модуль PowerShell, который действует как оболочка для API. Вы можете видеть, что он передает токен только при вызове командлета Connect-MgGraph, который, в свою очередь, автоматически передает токен любым дальнейшим вызовам API. А свойство code используется только для потока authorization code, который представляет собой делегированный поток, в котором участвует пользователь. ОП использует поток client credential без пользователя. Код ОП работает нормально.

scottwtang 19.02.2023 16:27

@scottwtang: Тогда почему оп опубликовал этот вопрос, если код работает? нет вызовов API для соединения. OP должен правильно вставить заголовок и тело HTTP. Как я уже сказал, похоже, что в MS Graph произошли изменения, чтобы сделать соединение более безопасным, и, возможно, CMDLET устарел.

jdweng 19.02.2023 18:03

@jdweng Код может работать нормально, если есть другая проблема, например, неправильные разрешения, примененные при регистрации приложения. Вы вообще пробовали запускать код? Потому что это работает нормально. Или приведите конкретный пример того, как, по вашему мнению, должен формироваться запрос

scottwtang 19.02.2023 19:01

@RomanKuznetsov Мне удалось воспроизвести ошибку после добавления всех трех разрешений Calendar, которые у вас есть. Мне удалось устранить ошибку, удалив разрешение Calendars.ReadBasic.All

scottwtang 19.02.2023 19:12

@scottwtang Да! это работает! Большое спасибо! Я бы не подумал, что разрешение «ReadBasic» будет мешать потоку. Если вы создадите ответ, я могу приписать вам успешно отвеченные вопросы.

Roman Kuznetsov 20.02.2023 09:34

@jdweng Как указал scottwtang, это была проблема с разрешением, но сам поток был так называемым потоком приложений, который представляет собой подход без пользователя, поэтому он может выглядеть иначе, чем вы ожидали.

Roman Kuznetsov 20.02.2023 09:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
16
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, как мы обнаружили, заключается в том, что разрешение Calendars.ReadBasic.All вызывало конфликт с другими разрешениями Calendar. Удаление этого разрешения устранило ошибку

Другие вопросы по теме