Области Outlook IMAP, приводящие к сбою АУТЕНТИФИКАЦИИ с помощью нового MS Graph API

#outlook #oauth #microsoft-graph-api #imap

#outlook #oauth #microsoft-graph-api #imap

Вопрос:

Я запрашиваю следующие области (URL в кодировке):

 offline_access user.read https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send
 

Процесс авторизации с помощью OAuth 2.0 с использованием нового Microsoft Graph API, похоже, работает нормально, но при использовании токена доступа для подключения к IMAP через XOAuth2 я получаю NO AUTHENTICATE , что указывает на недопустимость токена.

Ответ №1:

Оказывается, это проблема не с пользователем, а с Graph API от Microsoft. Хотя это не задокументировано, в настоящее время вам не разрешено запрашивать токен с областью, которая подпадает под двух клиентов, или он выберет один и завершится без сбоев.

В этом случае User.Read подпадает под действие Microsoft Graph tenancy. С технической точки зрения, если ваш пользователь является организационным пользователем Outlook / Office365, у них, вероятно, на самом деле не установлен Microsoft Graph, и правильная область будет https://outlook.office.com/User.Read . Однако конечная точка профиля Outlook устарела и ее не рекомендуется использовать (у вас также нет возможности узнать, имеет ли ваш пользователь MS Graph tenancy). Похоже, это решает проблему, user.read разрешение можно запросить без указания URL-адреса Microsoft Graph.

По сути, это то, что вы делаете выше, но может вводить в заблуждение, поскольку вы фактически не запрашиваете обычного пользователя.Разрешение на чтение, которое затем может быть разрешено клиенту Outlook. На самом деле происходит то, что пользователь.Разрешение на чтение сопоставляется с некоторым клиентом по умолчанию, и поэтому ваши области фактически содержат несколько клиентов (как клиента по умолчанию, так и Outlook).

Поскольку это не разрешено, он автоматически завершается сбоем и по умолчанию используется клиент по умолчанию. С большинством их API это все еще работает, но, в частности, с IMAP / SMTP вы не можете запросить ключ большей области / мультитенанта, иначе он не будет проверяться через XOAuth2. Вы заметите, что токены доступа, возвращаемые только для IMAP / SMTP, всегда намного меньше, чем токены доступа для других областей.

Чтобы исправить это, вам нужно будет запросить два токена доступа. Во-первых, вы должны использовать свой код авторизации для запроса ключа в следующей области:

 offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send
 

После этого вам необходимо запросить токен доступа для профиля. Однако с октября 2020 года вам больше не разрешается использовать один код авторизации для предоставления токенов множественного доступа. Таким образом, вам нужно будет войти в систему пользователя еще раз — канонический способ сделать это — просто вернуть его обратно к URL-адресу авторизации, оставив login_hint поле пустым. Это будет зависеть от того, как вы создаете свой URL-адрес, но вот пример в JS:

 url = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?'
url  = `client_id=${clientId}`
url  = 'amp;response_type=code'
url  = 'amp;redirect_uri=${redirectURI}'
url  = 'amp;response_mode=query'
url  = 'amp;login_hint='
url  = 'amp;scope=offline_access User.Read https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send'
url  = 'amp;state=12345
 

Обратите внимание, что ваш код авторизации должен запрашивать полную область (включая обе User.Read области и области IMAP, например IMAP.AccessAsUser.All , для обоих запросов маркеров доступа. Указание меньшей области не гарантирует, что профиль, который вы читаете, обязательно будет соответствовать учетной записи Outlook.

После получения этого второго кода авторизации (он не будет запрашивать у пользователя повторный вход в систему вручную, просто загрузите немного и автоматически разрешите второй код) вы можете запросить новый токен доступа со следующей областью:

 user.read
 

Вы можете включить любые другие области Graph API выше, но указание чего-либо в Outlook и особенно в IMAP приведет к путанице в ваших областях. Область ответа по-прежнему будет содержать области доступа EAS и Outlook, но с добавлением user.read разрешения.

Вы должны использовать этот второй токен для доступа к профилю и обновлять его отдельно от первого токена (который следует использовать только для IMAP / SMTP).