Могу ли я получить id_token из Azure AD для своего приложения? - PullRequest
0 голосов
/ 15 февраля 2019

Используя поток 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 приложениям, а также конечным пользователям?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

id_token выдается, когда пользователь входит в систему.У клиентских потоков учетных данных нет пользователя, поэтому id_token не выдается.

вам нужно будет использовать поток, например код авторизации или openID connect , чтобы подписать пользователяв. Ответ будет иметь id_token.

0 голосов
/ 15 февраля 2019

Вы не можете использовать поток учетных данных клиента, чтобы получить id_token только для приложения, он только возвращает access_token.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...