Ответ 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>"
}
}
Надеюсь, это обеспечит контекст и помощь людям, которые встретят этот вопрос в будущем.