Как решить "NoPermissionsInAccessToken", возвращаемую Microsoft Graph при чтении календаря или отправке почты - PullRequest
0 голосов
/ 06 ноября 2019

В нашем отделе у нас есть классический сайт ASP, который использует наши корпоративные учетные записи Google для проверки подлинности и для вставки событий в наши календари Google. Организация только что переключилась с Google на Office 365, и я пытаюсь переключить код на использование Outlook вместо этого - безуспешно.

Я могу использовать токен доступа для GET https://graph.microsoft.com/v1.0/me и просмотреть базовый профиль, но если я пытаюсь прочитать события календаря или отправить электронное письмо, я вижу сообщение:

"error": {
  "code": "NoPermissionsInAccessToken",
  "message": "The token contains no permissions, or permissions can not be understood."

Я создал учетную запись Azure со своей личной учетной записью Microsoft и добавил приложение. Я добавил своих коллег и свою корпоративную учетную запись в качестве гостевых пользователей. Я установил необходимые разрешения и сделал согласие администратора:

Application Permissions

Enterprise Application Permissions

Затем я выполнил шаги на этой странице .

Я впервые посещаю https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize, включая следующие элементы запроса:

client_id={client id}
response_type=code
redirect_uri={our URL}
response_mode=query
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
state={number}

Возвращает «код», который я отправляю на https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/token, включая:

grant_type=authorization_code
client_secret={client secret}
client_id={client id}
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
state={same number as above}
redirect_uri={same URL as above}
code={code returned from /authorize}

Возвращает токены идентификатора, доступа и обновления. Если я декодирую токен доступа, используя https://jwt.ms/,, он, кажется, содержит соответствующую аудиторию и область действия:

"aud": "https://graph.microsoft.com"
"scp": "Calendars.ReadWrite email Mail.Send openid profile User.Read"

... хотя я замечаю, что нет записи «Роли», которую я вижув некоторых документах. Это проблема?

Затем я отправляю токен доступа на https://graph.microsoft.com/v1.0/me со следующими заголовками:

"Authorization", "Bearer {access token}"
"Host", "graph.microsoft.com"
"Content-Type", "application/json"
"Prefer", "outlook.timezone Europe/London"

, который вернет мой адрес электронной почты и т. Д., Но если яизмените URL на что-нибудь еще, например /me/photo/$value, /me/calendar/events, или попробуйте отправить электронное письмо. Мне сказали, что в токене нет разрешений.

Я вижу, что есть другиеподобные вопросы, но они в основном для потока client_credentials (я не уверен, что это имеет какое-либо значение), и ни один из ответов не помог мне решить мою проблему.

Может кто-нибудь, пожалуйста, дайте мне знать, еслиЯ, очевидно, что-то пропустил - или я иду по этому поводу неправильно, чтобы получить доступ к данным Graph на стороне клиента? С Google это выглядело так просто, но я нахожу документацию и примеры Microsoft несколько менее подробными.

1 Ответ

1 голос
/ 06 ноября 2019

Добавление гостевых пользователей не имеет смысла.

То, что вы сделали, - это согласие администратора для Azure AD с вашей личной учетной записью Microsoft.

Что вам действительно нужно сделать, это согласие администратора для целевого клиента Azure AD / O365.

Создайте ссылку согласия следующим образом:

https://login.windows.net/{tenant ID of the target Azure AD}/oauth2/authorize?response_type=id_token&client_id={client ID}&redirect_uri={reply url}&response_mode=form_post&nonce=a4014117-28aa-47ec-abfb-f377be1d3cf5&resource=https://graph.microsoft.com&prompt=admin_consent

Получите доступ к ней в браузере и войдите в систему с учетной записью администратора целевого Azure AD.

Другая проблема заключается в том, что вы используете Получить доступ от имени пользователя . Поэтому в приложении Azure AD необходимо назначать делегированные разрешения, а не приложения.

enter image description here

...