Как создать клиента в Keycloak для использования с AWS Cognito Identity Federation

У меня есть пользовательская база с идентификацией и аутентификацией, управляемой keycloak. Я хотел бы разрешить этим пользователям входить в систему и использовать службы AWS API Gateway с Cognito, используя федерацию OpenID Connect.

Документация AWS по использованию поставщика OpenID Connect несколько отсутствует. Я нашел старую ссылку, используя SAML, но предпочел бы избежать этого и использовать OpenID Connect.

Если кто-то достиг этого, они не захотят написать некоторые простые инструкции с точки зрения администратора клавиатуры?

Ответ 1

Отвечая на мой собственный вопрос для будущих поисковиков на основе рекомендаций, которые я получил от поддержки AWS:

Сам вопрос основывался на недоразумении. AWS Cognito не аутентифицирует пользователей с помощью Keycloak - клиентское приложение делает это.

Cognito Identity Federation предлагает предоставить доступ к ресурсам AWS, создав учетные данные AWS Access для идентификации с токеном от внешнего поставщика удостоверений.

Клиент OpenID в keycloak - это тот же клиент, который используется конечным пользователем. URL-адреса перенаправления отправляют пользователя обратно в приложение, которое затем передает токен JWT в AWS для обмена учетными данными AWS.

Cognito полагается на клиентское приложение, которое сначала направляет пользователя к провайдеру проверки подлинности по своему выбору (в данном случае Keycloak), а затем передает токен доступа из Keycloak в Cognito, который использует его, чтобы 1) создать идентификатор, если это необходимо, и 2) сгенерировать AWS для доступа к роли AWS для "Аутентифицированных" пользователей в Cognito.

Пример использования AWS CLI: (замените ap-southeast-2 в примерах с вашим местным регионом)

Prerequsite: клиентское приложение получает токен доступа JWT для конечного пользователя с использованием любого метода проверки OpenID

Создайте или получите личность от cognito:

aws cognito-identity get-id --cli-input-json file://test.json

Возвращает личность:

{
    "IdentityId": "ap-southeast-2:<identity_uuid>"
}

test.json содержит сведения об учетной записи AWS, пуле cognito и токене доступа JWT от keycloak:

{
    "AccountId": "123456789012",
    "IdentityPoolId": "ap-southeast-2:<cognito-identity-pool-uuid>",
    "Logins": {
        "keycloak.url/auth/realms/realmname": "<access_token_jwt>"
     }
}

Затем приложение может использовать этот возвращенный идентификатор вместе с токеном доступа JWT, чтобы получить учетные данные AWS, с помощью которых можно использовать службы AWS...

aws cognito-identity get-credentials-for-identity --identity-id ap-southeast-2:<identity_uuid> --cli-input-json file://test2.json

Возвращает AccessKeyId, SecretKey и AWS SessionToken вместе с временем истечения срока действия. Они могут использоваться для доступа к службам AWS в зависимости от разрешений аутентифицированной роли, которая была установлена в настройке для Cognito Federated Identity Pool:

{
    "Credentials": {
        "SecretKey": "<secret_key>",
        "SessionToken": "<aws_cli_session_token>",
        "Expiration": 1567891234.0,
        "AccessKeyId": "<access_key>"
    },
    "IdentityId": "ap-southeast-2:<identity_uuid>"
}

Содержимое test2.json

{
    "IdentityId": "ap-southeast-2:<identity_uuid>",
    "Logins": {
        "keycloak.url/auth/realms/realmname": "<keycloak_access_token_jwt>"
    }
}

Надеюсь, это обеспечит контекст и помощь людям, которые встретят этот вопрос в будущем.