#azure-active-directory #microsoft-graph-api #sharepoint-online
Вопрос:
У меня довольно странная проблема (ну, я думаю, что это так)… Я создаю веб-приложение с использованием Ionic Angular, и это приложение должно отправлять информацию на сайт SharePoint в нашей компании. Аутентификация для приложения выполняется с помощью библиотеки аутентификации Microsoft для Angular (v1), и пользователями приложения могут быть как гостевые пользователи AzureAD, так и фактические пользователи компании. Приложение успешно аутентифицирует пользователей обоих типов, и им выдается idToken вместе с accessToken. Маркер доступа затем используется для выполнения запросов API GET, ИСПРАВЛЕНИЯ и публикации графиков для определенных списков на сайте SharePoint.
Если я войду в систему как полноправный пользователь… нет никаких проблем, приложение может успешно выполнять все три типа запросов по спискам. Однако, если я вошел в приложение как гостевой пользователь, я могу успешно выполнять только запросы на ПОЛУЧЕНИЕ и ИСПРАВЛЕНИЕ, но не ПУБЛИКОВАТЬ:
Я проверил области действия токена с помощью https://jwt.ms и убедитесь, что присутствуют следующие области:
- Сайты.Управлять.Все
- Сайты.Читайте.Все
- Сайты.Переписать.Все
- Пользователь.Прочитать профиль по электронной почте openid
Разрешения для списков предоставляются через членство в домене/группе безопасности Azure AD и то и другое; полноправный пользователь и гостевой пользователь являются участниками.
Чтобы еще больше добавить к этому, я вошел на сайт SharePoint онлайн в качестве приглашенного пользователя и могу успешно просматривать, добавлять и редактировать элементы списка из списка, но, похоже, я не могу сделать это с помощью API Graph.
Кто-нибудь видел такое поведение раньше или у кого-нибудь есть какие-либо указания?
Заранее спасибо.
Это моя настройка регистрации приложения в отношении разрешений: Разрешения API
Ответ №1:
Пожалуйста, проверьте свои разрешения на портале Azure. При получении маркера доступа от пользователя, вошедшего в систему, вам необходимо убедиться, что делегированное разрешение Sites.ReadWrite.All
установлено, и предоставить согласие администратора для вашего арендатора.
И в область действия должно быть добавлено это разрешение для запроса маркера доступа.
POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
client_id=<client_id>
amp;scope=https://graph.microsoft.com/Sites.ReadWrite.All
amp;code=<authorization_code, see https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code>
amp;redirect_uri=<redirect_uri>
amp;grant_type=authorization_code
amp;code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong
amp;client_secret=<client_secret>
Это может быть задержка примерно на 5-10 минут после добавления разрешения.
Комментарии:
1. Здравствуйте, спасибо за ваше предложение. К сожалению, это уже так, я, похоже, не могу предоставить изображение в этом комментарии, поэтому обновлю вопрос с его помощью. Регистрация приложения имеет следующие разрешения делегата, каждое из которых предоставляется для организации другим администратором Azure: Сайты. Управлять. Все, Сайты. Чтение и запись. Все, Сайты.Читайте. Все, Пользователь.Все
2. Кроме того, при запуске потока аутентификации через MSAL это URL-адрес:
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize ?response_type=id_token amp;scope=user.read openid profile sites.readwrite.all sites.manage.all amp;client_id=<client_id> amp;redirect_uri=http://localhost:8100/loading amp;state=<state> amp;nonce=<nonce> amp;client_info=<client_info> amp;client-request-id=<lient-request-id> amp;response_mode=fragment
3. Как видно из URL-адреса, вы используете неявный поток .
response_type=id_token
означает получение id_token, но не токена доступа, попробуйте сresponse_type=token
помощью .4. Да, вы правы, однако библиотека MSAL, которую я использую, автоматически извлекает ссылки доступа с определенными областями для меня, я не вызываю эти URL-адреса авторизации/токенов вручную. Когда я проверяю полезную нагрузку успешного входа/авторизации. Я вижу, что извлечены как idToken, так и accessToken . И когда я проверяю доступ через jwt.ms Я вижу определенные области. Поэтому я бы ожидал, что токен будет действительным и пригодным для использования (и на самом деле он предназначен для ПОЛУЧЕНИЯ и ИСПРАВЛЕНИЯ) для ресурса Graph…