Я изучаю Microsoft Graph и для этого использую Graph Explorer и Postman.
С Graph Explorer: я вошел в систему с моей личной учетной записью пользователя (hotmail). Как только я подключаюсь, я вижу токен. Странно, когда я копирую/вставляю этот токен в jwt.io , он не может быть декодирован. Тем не менее, я могу выполнить такой запрос, как https://graph.microsoft.com/v1.0/me , который возвращает мне некоторую информацию о себе как о пользователе (с http 200). Или этот запрос https://graph.microsoft.com/v1.0/me/sendMail который позволяет мне отправить тестовое письмо и получить тестовое письмо (с http 202). Все эти запросы были «делегированным разрешением». Так что у меня нет проблем с использованием Graph Explorer с моей личной учетной записью (hotmail).
С Postman: на этот раз я проведу несколько тестов с «разрешением приложения». Я выполнил следующие шаги:
На портале Azure
Шаг 1: Регистрация приложений / Новая регистрация / Я даю имя / Выберите 3-й тип учетной записи (Учетные записи в любом организационном каталоге и личные учетные записи Microsoft) / Нажмите кнопку «Регистрация».
Шаг 2: Разрешения API/Добавить разрешение/Microsoft Graph/Разрешения приложения/Mail.Send (отправлять почту от имени любого пользователя)
Шаг 3: Согласие главного администратора на кнопку... для активации разрешения
Шаг 4: Сертификат и секреты / Новый секрет клиента / Введите описание / Нажмите кнопку «Добавить»
Шаг 5: Получите токен в Postman
ПОЧТА
ЗАГОЛОВКИ
ТЕЛО
Хорошо, я получил токен
При копировании/вставке этого токена в jwt.io я вижу это:
Шаг 6: Запрос для перечисления всех пользователей
ПОЛУЧАТЬ
РАЗРЕШЕНИЕ
ЗАГОЛОВКИ
Хорошо, я получил информацию для всех пользователей (в виде json)
Шаг 7: Запрос на отправку письма
{
"message": {
"subject": "This is my subject",
"body": {
"contentType": "Text",
"content": "This is my content"
},
"toRecipients": [
{
"emailAddress": {
"address": "[email protected]"
}
}
],
"ccRecipients": [
]
},
"saveToSentItems": "false"
}
Я хотел бы знать, почему я получил эту ошибку? Я могу отправлять электронную почту с помощью Graph Explorer (при использовании делегированного разрешения), а не с помощью Postman (при использовании разрешения приложения).
Как вы можете видеть ниже, я даю согласие администратора в корпоративных приложениях на портале Azure.
Я где-то читал, что ошибка означает, что у пользователя нет почтового ящика в облаке EXO. EXO — это онлайн-облако Exchange O365. Поэтому, если у вас нет почтового ящика в облаке, API REST O365 Exchange не будут работать для этих пользователей. Если это так, что бы вы сделали?
У меня есть веб-приложение, которое должно отправлять почту из общего почтового ящика. Независимо от того, какой пользователь подключен, это всегда тот же почтовый ящик, который используется для отправки почты. Вот почему я выбираю «разрешение приложения» и «поток учетных данных клиента».
Как объяснялось выше, я использую свою личную учетную запись (hotmail) для целей тестирования, но в рабочей среде я буду использовать рабочую учетную запись (недоступную из моей среды разработки).
В качестве примечания: я знаю, что существуют библиотеки для облегчения процесса и предотвращения использования вызовов REST API (URL-адресов), но я не думаю, что это может объяснить проблему, с которой я сталкиваюсь.
Определенно проблема не связана с прямым использованием вызовов или библиотек REST API. В качестве примечания, вы можете попробовать то же самое с POSTMAN, и это сработает для вас. Если вы столкнулись с проблемой, поделитесь ею здесь - я рад помочь.
Итак, из вашего ответа я понимаю, что вы подтверждаете, что проблема не что иное, как личная учетная запись, не поддерживаемая для потока учетных данных клиента (разрешение приложения).
Я вижу комментарий ниже, который связан с лицензией EXO или с назначением его в качестве гостевого пользователя, так что это неправильно. Вам необходимо убедиться, что данный почтовый ящик находится в Office 365, и это является обязательным условием для доступа с помощью Microsoft Graph API (даже если его гибридное развертывание Exchange Server также).
@Dev Я думаю, мы говорим об одном и том же. Если пользователю назначена лицензия Exchange Online, почтовый ящик размещается в O365. Вы можете попробовать новую рабочую учетную запись без лицензии Exchange Online. Это даст ту же ошибку MailboxNotEnabledForRESTAPI - REST API is not yet supported for this mailbox
. И в качестве примера я также упомянул, что мне не удалось добавить лицензию EXO в личный кабинет, что объясняет, что эта ситуация не поддерживается. Так что я согласен, что you're trying to access a given mailbox which is not available in the Office 365
. Но я не думаю, что ошибаюсь.
«MailboxNotEnabledForRESTAPI — REST API еще не поддерживается для этого почтового ящика» Это сообщение об ошибке означает, что учетная запись электронной почты, которую вы используете для отправки электронной почты, не имеет лицензии Exchange Online.
Для личной учетной записи следует использовать делегированное разрешение, которое вы пробовали в Microsoft Graph Explorer. Смотрите Разрешения здесь.
.
Если мы добавим личную учетную запись в ваш клиент в качестве гостевого пользователя, хотя мы можем Назначить лицензию гостевому пользователю (я предполагаю, что мы можем назначить лицензию EXO гостевому пользователю), почтовый ящик, размещенный в EXO, отличается от почтовый ящик личного кабинета. Это полностью 2 отдельных почтовых ящика. И на самом деле мне не удалось назначить гостю лицензию EXO.
Таким образом, в этом случае поток учетных данных клиента применяется к пользователям AAD, а не к личной учетной записи.
ОБНОВЛЯТЬ:
Для личной учетной записи, которая использует делегированное разрешение (вы пробовали в Microsoft Graph Explorer), конечной точкой полномочий является https://login.microsoftonline.com/commonm/oauth2/v2.0/authorize
или https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize
.
Но когда вы используете поток учетных данных клиента с разрешением приложения, вы должны указать идентификатор клиента в запросе https://login.microsoftonline.com/{tenant id}/oauth2/v2.0/authorize
.
Хотя ваша личная учетная запись добавлена в клиент как гостевой пользователь, у нее нет лицензии EXO (на основе теста мы не можем назначить ей лицензию EXO), поэтому она не будет размещена в O365.
Вот почему мы не можем использовать поток учетных данных клиента с личной учетной записью.
Как вы правильно заметили, вы получаете сообщение об ошибке «MailboxNotEnabledForRESTAPI», когда пытаетесь получить доступ к данному почтовому ящику, который недоступен в Office 365. Чтобы преодолеть это, попробуйте получить доступ к рабочему почтовому ящику (как вы сказали, у вас есть планы для доступа к вашей рабочей учетной записи, и я надеюсь, что это почтовый ящик Office 365), и это сработает для вас. Надеюсь это поможет.