Tengo una base de usuarios con identidad y autenticación administrada por keycloak. Me gustaría permitir que estos usuarios inicien sesión y utilicen los servicios de AWS API Gateway con Cognito mediante una federación de OpenID Connect.
Falta algo de documentación de AWS sobre el uso de un proveedor de OpenID Connect. Encontré una referencia antigua usando SAML pero preferiría evitar esto y usar OpenID Connect.
Si alguien ha logrado esto, ¿le importaría escribir algunas instrucciones simples desde la perspectiva del administrador de keycloak?
Respondiendo a mi propia pregunta para futuros buscadores según los consejos que he recibido de AWS Support:
La pregunta en sí se basó en un malentendido. AWS Cognito no autentica a los usuarios con Keycloak; la aplicación cliente lo hace.
Cognito Identity Federation consiste en otorgar acceso a los recursos de AWS mediante la creación de credenciales de acceso de AWS a una identidad con un token de un proveedor de identidad externo.
El cliente OpenID en keycloak es el mismo cliente que utiliza la aplicación del usuario final. Las URL de redirección envían al usuario de regreso a la aplicación, que luego pasa el token JWT a AWS para intercambiarlo por las credenciales de AWS.
Cognito se basa en que la aplicación cliente dirige primero al usuario al proveedor de autenticación de su elección (en este caso, Keycloak) y luego pasa el token de acceso de Keycloak a Cognito, que lo usa para 1) crear una identidad si es necesario, y 2) generar Credenciales de AWS para acceder al rol de AWS para usuarios "autenticados" en Cognito.
Requisito previo: la aplicación cliente obtiene el token de acceso JWT para el usuario final mediante cualquier método de autenticación OpenID
Cree o recupere una identidad de cognito:
aws cognito-identity get-id --cli-input-json file://test.jsonDevuelve la identidad:
{ "IdentityId": "ap-southeast-2:<identity_uuid>" } (sustituya ap-southeast-2 en los ejemplos con su región local)
test.json contiene los detalles de la cuenta de AWS, el grupo de Cognito y el token de acceso JWT del usuario de Keycloak:
{ "AccountId": "123456789012", "IdentityPoolId": "ap-southeast-2:<cognito-identity-pool-uuid>", "Logins": { "keycloak.url/auth/realms/realmname": "<access_token_jwt>" } }Luego, la aplicación puede usar esta identidad devuelta, junto con el token de acceso de JWT para obtener credenciales de AWS con las que consumir los servicios de AWS...
aws cognito-identity get-credentials-for-identity --identity-id ap-southeast-2:<identity_uuid> --cli-input-json file://test2.jsonDevuelve un AccessKeyId, un SecretKey y un AWS SessionToken junto con un tiempo de caducidad. Estos se pueden utilizar para acceder a los servicios de AWS según los permisos del rol autenticado que se estableció en la configuración del grupo de identidades federadas de Cognito:
{ "Credentials": { "SecretKey": "<secret_key>", "SessionToken": "<aws_cli_session_token>", "Expiration": 1567891234.0, "AccessKeyId": "<access_key>" }, "IdentityId": "ap-southeast-2:<identity_uuid>" } El contenido de test2.json
{ "IdentityId": "ap-southeast-2:<identity_uuid>", "Logins": { "keycloak.url/auth/realms/realmname": "<keycloak_access_token_jwt>" } }Espero que esto brinde contexto y asistencia a las personas que tropiecen con esta pregunta en el futuro.