Ошибка при попытке доступа к календарям других пользователей-клиентов с помощью MS Graph API.

У меня есть приложение node.js / express. Я пытаюсь использовать Microsoft Graph API для получения календарей пользователей [только для чтения].

Библиотека OAuth2 для входа в систему: модуль npm паспорт-microsoft.

Я выполнил следующие шаги на портале Azure:

  1. Перейти в Active Directory

  2. Нажмите "Регистрация приложений" на левой панели.

  3. Нажмите «Новая регистрация» и создайте приложение.
  4. Перейти в новое приложение
  5. Нажмите «Аутентификация» на левой панели и добавьте URI перенаправления.
  6. Перейдите в Разрешения API и включите следующее:

    а. Делегированные: Calendars.Read, Calendars.Read.Shared, профиль

  7. Предоставьте согласие администратора для всех необходимых разрешений.

Однако только пользователи, принадлежащие к моей лазурной организации, в которой я зарегистрировал свое веб-приложение, могут войти в систему.

Пользователи других организаций не могут войти в систему. Я получаю следующее сообщение об ошибке:

2019-11-11 10:16:35 default[20191109t101750]  InternalOAuthError: failed to fetch user profile
2019-11-11 10:16:35 default[20191109t101750]      at /srv/node_modules/passport-microsoft/lib/strategy.js:86:29
2019-11-11 10:16:35 default[20191109t101750]      at passBackControl (/srv/node_modules/oauth/lib/oauth2.js:132:9)
2019-11-11 10:16:35 default[20191109t101750]      at IncomingMessage.<anonymous> (/srv/node_modules/oauth/lib/oauth2.js:157:7)
2019-11-11 10:16:35 default[20191109t101750]      at IncomingMessage.emit (events.js:203:15)
2019-11-11 10:16:35 default[20191109t101750]      at IncomingMessage.EventEmitter.emit (domain.js:466:23)
2019-11-11 10:16:35 default[20191109t101750]      at endReadableNT (_stream_readable.js:1145:12)
2019-11-11 10:16:35 default[20191109t101750]      at process._tickCallback (internal/process/next_tick.js:63:19)

Вы можете прочитать мой предыдущий вопрос для справки здесь


comment
Ваше приложение должно позволять другим организациям входить в систему, сделав его мультитенантным.   -  person juunas    schedule 09.11.2019
comment
Я сделал его мультитенантным, но все равно безуспешно.   -  person vasu014    schedule 10.11.2019
comment
Добавьте дополнительные сведения о полученном сообщении об ошибке.   -  person Allen Wu    schedule 11.11.2019
comment
Я добавил шаги, которые выполняю, и получаемое сообщение об ошибке. Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию   -  person vasu014    schedule 11.11.2019
comment
Также. Приложение было зарегистрировано как мультитенантное с самого начала.   -  person vasu014    schedule 11.11.2019


Ответы (2)


Недостаточно зарегистрировать приложение как мультитенантное и получить согласие администратора для вашего собственного клиента.

Вам необходимо получить согласие администратора для этого мультитенантного приложения Azure AD в отношении других клиентов.

Чтобы предоставить согласие администратора через URL-запрос:

Создайте запрос к login.microsoftonline.com с конфигурациями вашего приложения и добавьте его в &prompt=admin_consent.

Этот URL будет выглядеть так: https://login.microsoftonline.com/<tenant-id of other tenant>/oauth2/authorize?client_id=<client id>&response_type=code&redirect_uri=<redirect URI>&nonce=1234&resource=https://graph.microsoft.com&prompt=admin_consent

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

person Allen Wu    schedule 12.11.2019
comment
Значит, этот процесс нужно будет выполнить для всех арендаторов, которые хотят использовать это приложение? Как только это приложение будет запущено в производство и у нас появится новый клиент в качестве пользователя, как это лучше всего реализовать? Согласие администратора, то есть - person vasu014; 12.11.2019
comment
Кроме того, приложение будет размещено на GCP, просто используя регистрацию приложения AD для использования Microsoft Graph API. - person vasu014; 12.11.2019
comment
да. Вам необходимо получить согласие администратора для каждого другого клиента, который хочет использовать ваше приложение Azure AD. Вы можете сгенерировать запрос в своем веб-приложении и заставить администратора нового клиента войти в систему, чтобы дать согласие администратора, когда они начнут работать. - person Allen Wu; 12.11.2019
comment
Прохладный. Спасибо за совет, Аллен. Я попробую это сегодня и обновлю здесь. - person vasu014; 12.11.2019
comment
Мне нужно реализовать это таким образом, чтобы мне не требовалось одобрение администратора, прежде чем другие пользователи смогут начать доступ к продукту. Так же, как вход в Google - person vasu014; 25.11.2019
comment
То, что вы хотите достичь, противоречит стратегии проверки подлинности Azure AD. Прежде чем пользователи из вашего собственного клиента смогут получить доступ к данным, вам необходимо получить согласие администратора на портале Azure (нажав «Предоставить согласие администратора для {вашего клиента}»). Как пользователи других клиентов могут получить доступ к данным без согласия администратора для своих клиентов? Даже если приложение Azure AD зарегистрировано в собственном клиенте, им потребуется согласие администратора. - person Allen Wu; 25.11.2019
comment
Хм. да. Это верный момент. Но как тогда такие приложения, как Calendly, предоставляют вход в office365 / outlook без согласия администратора? Они используют другой механизм? - person vasu014; 25.11.2019

Старая версия согласия администратора у меня не работала.

Теперь URL для согласия администратора выглядит так:

https://login.microsoftonline.com/{tenant-id}/adminconsent?client_id={client-id}

У меня это сработало. Новая версия описана в Grant tenant -общее согласие администратора на приложение

person hypers    schedule 19.03.2020