Неверный access_token из AAD с потоком OAuth2

Я делаю поток аутентификации кода аутентификации OAuth 2.0 с многопользовательским приложением. Вот мой авторизационный URL: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=my_id&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauthorize&response_type=code&scope=openid+offline_access&state=17

Все идет нормально, и я получаю auth_code. Затем я делаю запрос с этим auth_code на token_url и получаю много информации, например:

  1. token_type
  2. объем
  3. id_token
  4. access_token
  5. refresh_token
  6. expires_at
  7. ext_expires_in

Мне кажется, это нормально, но когда я делаю запрос к API с access_token, например: https://management.azure.com/subscriptions/my_sub_id/locations?api-version=2016-06-01 с заголовками:

Content-Type:
  - application/json
Authorization:
  - Bearer EwBQA8l6BAAURSN/FHlDW5xN74t6GzbtsBBeBUYAAV1IHgHb4dOWblzfd/YsSuFicAMDYbua17QivnAT9/pIaeKAg3uKsK5VGqWLzjMOUQrCpd7R1RAM6RkzI0u8e4rpO7DISG7qLso5H5+U1jb+38/j1urcwlXMMxhy83ZXmdpkLXpZV+vcOV...

Отвечает с ошибкой 401

body:
  encoding: UTF-8
  string: '{"error":{"code":"InvalidAuthenticationToken","message":"The access token is invalid."}}'

Честно говоря, я думаю, что что-то не так с моим access_token. Мне кажется, это не похоже на JWT. Документация говорит, что это выглядит так:

"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCEV1Q..."

Но мой access_token выглядит так:

"access_token": "EwBYA8l6BAAURSN/FHlDW5xN74t6GzbtsBBeBUYAAZDe7JE/MPLoAi+Fr+1Xxq5eBe5N9l8Q+c4QjkY5PGEzRnBpPe7+v6h+PLdh1cceBQx+/JsB2QCrYSCt7x/zGsQAhwoY/"

Все в порядке?

Вот мои разрешения для приложения: Разрешения

Попробуйте добавить субъект-службу в свою подписку, перейдите к своей подписке на портале -> Контроль доступа (IAM) -> Добавить -> Добавить назначение роли, добавьте ее как роль (например, владельца).

Joy Wang 09.05.2019 11:25

Кроме того, попробуйте включить https://management.azure.com/ в scope, когда вы запрашиваете код авторизации и токен доступа, смотрите эту ссылку: docs.microsoft.com/en-us/azure/active-directory/develop/…

Joy Wang 09.05.2019 11:43

Это https://management.azure.com/ не является допустимой областью действия. Я думаю, мне нужно установить правильный объем.

Roman Alekseiev 09.05.2019 12:04
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
3
296
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема, с которой вы столкнулись, заключается в том, что вы запросили только токен доступа для областей действия openid offline_access. Результирующий токен доступа будет для Microsoft Graph (https://graph.microsoft.com), а не для Azure REST API (https://management.azure.com).

Чтобы указать, что вам нужен токен для данного API, параметр scope в вашем запросе на авторизацию должен включать делегированное разрешение, которое вы хотите, чтобы приложение имело для API. В случае Azure REST API существует только одно делегированное разрешение: user_impersonation. URI идентификатора для Azure REST API — https://management.azure.com, поэтому значение области, которое вы хотите использовать, — это:

openid offline_access https://management.azure.com/user_impersonation

Еще два важных замечания:

  1. Как вы обнаружили, вам не всегда будет выдан токен доступа в виде JWT, который вы можете декодировать для просмотра. Формат маркера доступа — это соглашение между службой, выпустившей маркер (в данном случае Azure AD или учетные записи Майкрософт), и службой, для которой был выпущен маркер (в данном примере — Microsoft Graph).
  2. Вы должны всегда включать нетprompt=consent. prompt=consent следует использовать только в том случае, если вы уже пытались войти в систему пользователя без, пользователю необходимо повторно запросить согласие на новое разрешение.

    Если вы просто включите необходимые области в параметр scopes, платформа Microsoft Identity позаботится о том, чтобы выяснить, нужно ли ей запрашивать согласие или нет. Если вы всегда включаете prompt=consent, вы обнаружите, что многим организациям будет заблокирован доступ к вашему приложению, потому что они отключили возможность для пользователей давать согласие самостоятельно (и этот параметр конкретно указывает, что вы требовать пользователю, которому будет предложено снова).

Другие вопросы по теме

Как настроить имена таблиц для Asp.Net Identity (например, сменить AspNetUsers на пользовательское имя)
Как получить разрешение r_fullprofile для моего клиентского приложения Linked In OAuth 2.0?
Как проверить учетные данные для подписи x509 с помощью IdentityServer4
Отсутствует подходящий bean-компонент типа «org.hibernate.SessionFactory»: ожидается по крайней мере 1 bean-компонент, который квалифицируется как кандидат на автоматическое подключение
Аутентификация не удалась из-за отсутствия заголовка "авторизация"
Какую технологию или алгоритм использует Doorkeeper для создания своих токенов обновления и токенов доступа и почему он защищен
Доступ с личной учетной записью к мультитенантному приложению AAD
Аутентификация пользователя в DeviantArt
Зачем использовать токен идентификатора подключения openid, если токен доступа имеет все претензии и может быть отозван?
Как получить значение ResponseEntity в Spring Boot?