Office365 EWS API: токен имеет недопустимое значение «роли» для типа утверждения «».

Я пытаюсь получить доступ к REST API Office365 с помощью OAuth2: http://msdn.microsoft.com/en-US/library/office/dn605901.aspx

Я выполнил все шаги, описанные здесь: http://blogs.msdn.com/b/exchangedev/archive/2014/03/25/using-oauth2-to-access-calendar-contact-and-mail.-api-in-exchange-online-in-office-365.aspx

У меня есть токен OAuth2 для ресурса "https://outlook.office365.com/", но когда я пытаюсь получить доступ к API, я получаю следующую ошибку:

"The token has invalid value 'roles' for the claim type ''."

Мне удалось получить доступ к Windows Azure AD «Graph» API, используя ту же логику, и я не видел ничего, связанного с «претензией» нигде в документе. Я что-то упускаю ?

До сих пор я пытался добавить или удалить prompt=admin_consent из uri авторизации, что вызывает соответствующий диалог от Microsoft, но это ничего не меняет.

Я отправляю запрос на следующую конечную точку:

https://outlook.office365.com/EWS/OData/Me/Inbox/Messages

А это сырой ответ:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Server: Microsoft-IIS/8.0
request-id: b5b3df59-c23d-4a47-83b7-79c2f7ed6211
Set-Cookie: ClientId=OGLQDFMY0KPSRZSMJBA; expires=Fri, 07-Aug-2015 14:00:33 GMT; path=/; HttpOnly
X-CalculatedBETarget: dm2pr0701mb1216.namprd07.prod.outlook.com
x-ms-diagnostics: 2000001;reason="The token has invalid value 'roles' for the claim type ''.";error_category="invalid_token"
X-DiagInfo: DM2PR0701MB1216
X-BEServer: DM2PR0701MB1216
X-AspNet-Version: 4.0.30319
Set-Cookie: exchangecookie=17695b411d96429b9a2e2db37905b856; expires=Fri, 07-Aug-2015 14:00:35 GMT; path=/; HttpOnly
Set-Cookie: [email protected]=u56Lnp2ejJqBnZqdm8zIm8bSzMnNyNLLz52a0sfGx8zSy8nHm53Myc+anMqcgZyTmomajZ6YmtGQkZKWnI2QjJCZi9GckJKBzc/Oy9LPxtLPyavOy8XPz8XMyg==; expires=Sat, 06-Sep-2014 14:00:35 GMT; path=/EWS; secure; HttpOnly
X-Powered-By: ASP.NET
X-FEServer: AMSPR02CA0019
WWW-Authenticate: Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trusted_issuers="00000001-0000-0000-c000-000000000000@*", authorization_uri="https://login.windows.net/common/oauth2/authorize", error="invalid_token",Basic Realm="",Basic Realm=""
Date: Thu, 07 Aug 2014 14:00:34 GMT
Connection: close
Content-Length: 0

К вашему сведению, я разрабатываю приложение Symfony2, используя библиотеку «lusitanian/oauth» для OAuth с несколькими настройками для подключения к Azure AD.

Я буду очень благодарен за любую помощь, которую вы можете оказать :)

[ИЗМЕНИТЬ]

Между прочим, API отлично работает с базовой HTTP-аутентификацией, но это вынудило бы меня хранить все пароли пользователей в открытом виде в моей базе данных, что довольно ужасно.

Делегированные разрешения для Office 365 Exchange Online в серверной части Azure установлены на 3 (чтение контактов, календаря и почты).


person VincentChalnot    schedule 07.08.2014    source источник
comment
Привет, у тебя есть какие-то успехи? Я пытаюсь создать драйвер Laravel Socialite для Azure AD, но у меня очень похожие проблемы (400: неверный запрос; отсутствует утверждение UPN).   -  person Boyan    schedule 22.07.2015
comment
Привет! Я думаю, что на момент написания моего первоначального поста работа над API Azure находилась в стадии разработки, поэтому мы ожидали некоторых особенностей, в то время как наш проект был заброшен по разным причинам, поэтому мы так и не узнали причину этой ошибки.   -  person VincentChalnot    schedule 23.07.2015


Ответы (2)


Большое спасибо за ваш ответ, разрешения для Exchange и Sharepoint настроены на перечисление и чтение в бэкэнде Azure, поэтому все должно быть в порядке ...

Я расшифровал токен и получил следующее:

{
 "typ": "JWT",
 "alg": "RS256",
 "x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
}.
{
 "aud": "https://outlook.office365.com/",
 "iss": "https://sts.windows.net/<tenant>/",
 "iat": 1407766971,
 "nbf": 1407766971,
 "exp": 1407770871,
 "ver": "1.0",
 "tid": "<tenant>",
 "oid": "996481f3-9769-4e02-ab1c-8c4c006da659",
 "sub": "996481f3-9769-4e02-ab1c-8c4c006da659",
 "idp": "https://sts.windows.net/<tenant>/",
 "appid": "<client>",
 "appidacr": "1"
}

Это не совсем похоже на то, что мы ожидали.

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

[РЕДАКТИРОВАТЬ]

Токен, который я получаю с помощью Graph API, выглядит так же и работает нормально:

{
    "aud": "https://graph.windows.net/",
    "iss": "https://sts.windows.net/<tenant>/",
    "iat": 1407767341,
    "nbf": 1407767341,
    "exp": 1407771241,
    "ver": "1.0",
    "tid": "<tenant>",
    "oid": "996481f3-9769-4e02-ab1c-8c4c006da659",
    "sub": "996481f3-9769-4e02-ab1c-8c4c006da659",
    "idp": "https://sts.windows.net/<tenant>/",
    "appid": "<client>",
    "appidacr": "1"
}

Таким образом, токен, похоже, не имеет разрешений.

person VincentChalnot    schedule 11.08.2014
comment
Если пользователь вошел в систему и дал согласие на ваше приложение, токены должны содержать информацию о пользователе и области действия. Я собираюсь отредактировать свой ответ, чтобы включить что-то еще, чтобы проверить. - person Jason Johnston; 16.08.2014

Когда вы зарегистрировали свое приложение в Azure AD, добавили ли вы разрешения для Office 365 Exchange Online? Вы установили разрешения приложения или делегированные разрешения? (Пользовательский интерфейс не должен отображать какие-либо доступные разрешения приложений, поскольку они еще не поддерживаются, но просто для уверенности...). Причина в том, что разрешения приложения обычно отображаются как «роли» в токене, а делегированные разрешения отображаются как «scp» в токене.

Кроме того, можете ли вы расшифровать свой токен доступа и сравнить с этим примером? Вы можете использовать http://jwt.calebb.net/ для быстрого анализа токена в кодировке base64. ты вернешься. Если вы застряли, вы можете опубликовать его здесь, но, пожалуйста, сначала удалите идентификатор клиента, идентификатор арендатора и информацию о пользователе! Я просто хочу увидеть структуру вместе с вашими значениями aud и scp (если они есть). Это должно выглядеть примерно так:

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
}

{
  "aud": "https://outlook.office365.com/",
  "iss": "https://sts.windows.net/<tenant_id>/",
  "iat": 1407344872,
  "nbf": 1407344872,
  "exp": 1407348772,
  "ver": "1.0",
  "tid": "<your tenant_id>",
  "amr": [
    "pwd"
  ],
  "oid": "169bf758-9811-4f6a-b924-80c6bbd4ad92",
  "upn": <user_email>,
  "unique_name": <user_email>,
  "sub": "2n3Mq5HtdCN1WVQk494lPipvfVxeSZCYATOpWyN92iA",
  "puid": "10037FF56F8936F7",
  "family_name": "Chaves",
  "given_name": "Mack",
  "appid": "<your client_id>",
  "appidacr": "0",
  "scp": "Contacts.Write Calendars.Write Mail.Send Mail.Write",
  "acr": "1"
}

Если он выглядит иначе, возникла проблема с регистрацией вашего приложения. Обязательно выполните действия, описанные в http://msdn.microsoft.com/EN-US/library/office/dn605894(v=office.15).aspx, в частности "Зарегистрируйте веб-приложение в Azure AD вручную", "Получите ключ приложения" и разделы «Настройка разрешений API» (в вашем случае с использованием Exchange вместо SharePoint).

ИЗМЕНИТЬ

Войдите на страницу https://manage.windowsazure.com и перейдите к своему приложению. Выбрав свое приложение, нажмите кнопку «Управление манифестом» внизу и выберите загрузку манифеста. Откройте это с помощью текстового редактора. Опубликуйте только раздел под названием «requiredAppPermissions», и я сверю его со своим.

person Jason Johnston    schedule 08.08.2014