Используя поток client_credentials в Azure AD, я не могу получить id_token для своего приложения.
Я экспериментирую с конечными точками OAuth / OpenID Azure AD и сталкиваюсь с некоторыми вопросами.
Я создаю простое приложение с минимальной конфигурацией через Graph API (конечная точка бета, но все же).Я удалил все заголовки и анонимизировал приведенные ниже фрагменты кода:
curl -X POST \
https://graph.microsoft.com/beta/applications \
-d '{
"displayName": "App Name",
"passwordCredentials": [
{
"endDateTime": "2299-12-30T23:00:00Z",
"startDateTime": "2019-02-14T20:19:14.686691Z",
"secretText": "<SOME KEY>",
"displayName": "Client Secret"
}
]
}'
В ответе Azure AD я получил идентификатор приложения:
{
"@odata.context": "https://graph.microsoft.com/beta/$metadata#applications/$entity",
"id": "<SOME GUID>",
"deletedDateTime": null,
"isFallbackPublicClient": null,
"appId": "<SOME GUID>",
...
Этого достаточно для меня, чтобывозможность получить access_token из конечной точки OAuth v1:
curl -X POST \
https://login.microsoftonline.com/tenant_id/oauth2/token \
-d 'client_id=appId&client_secret=secretText&grant_type=client_credentials'
Ответ:
{
"token_type": "Bearer",
"expires_in": "3600",
"ext_expires_in": "3600",
"expires_on": "1550220412",
"not_before": "1550216512",
"resource": "00000002-0000-0000-c000-000000000000",
"access_token": "<JWT access token>"
}
Поскольку я не указал ресурс в своем вызове, я получаю ресурс API API по умолчанию..
Теперь я также хотел бы получить id_token для моего приложения.Мне удалось получить эти токены от других поставщиков OpenID.Тем не менее, OpenID Connect Core спец.дает мне основание полагать, что id_tokens предназначены только для конечных пользователей, а не для приложений:
"Идентификационный токен - это токен безопасности, который содержит утверждения об аутентификации конечного пользователя сервером авторизации при использовании Клиента,и потенциально другие запрошенные утверждения "
(с https://openid.net/specs/openid-connect-core-1_0.html#IDToken)
Добавление resource=openid
к POST к конечной точке токена выше не будет работать, так как openid является областью, а не ресурсом.
Переключаясь на конечные точки v2, я получаю доступ к параметру области. Я могу получить оттуда токен доступа, установив scope=https://graph.microsoft.com/.default
, явно запрашивая доступ, который я получил по умолчанию через конечную точку v1.
Однако установка области действия, например, scope=https://graph.microsoft.com/.default openid
, не дает мне id_token для моего приложения, и токен доступа выглядит идентично предыдущему вызову.
Попытка scope=openid
дает мне следующееошибка от Azure AD:
AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope openid is not valid.
Все это вместе заставляет меня поверить, что провайдеры OpenID, которых я использовал и выпустили id_tokens черезgh поток client_credentials нарушает спецификацию, и этот id_tokens может быть получен только для конечных пользователей (использование потока authorization_code дает мне id_token из Azure AD для меня без каких-либо проблем).
Это правильный вывод,или я могу заставить Azure AD выдавать id_tokens приложениям, а также конечным пользователям?