J'ai une base d'utilisateurs avec identité et authentification gérée par keycloak. Je voudrais autoriser ces utilisateurs à se connecter et à utiliser les services AWS API Gateway avec Cognito à l'aide d'une fédération OpenID Connect.
La documentation AWS sur l'utilisation d'un fournisseur OpenID Connect fait quelque peu défaut. J'ai trouvé un ancienne référence en utilisant SAML mais je préférerais éviter cela et utiliser OpenID Connect.
Si quelqu'un a atteint cet objectif, cela leur dérangerait-il d'écrire quelques instructions simples du point de vue de l'administrateur keycloak?
Répondre à ma propre question pour les futurs chercheurs sur la base des conseils que j'ai reçus du support AWS:
La question elle-même était fondée sur un malentendu. AWS Cognito n'authentifie pas les utilisateurs avec Keycloak - l'application cliente le fait.
Cognito Identity Federation consiste à accorder l'accès aux ressources AWS en créant des informations d'identification AWS Access à une identité avec un jeton provenant d'un fournisseur d'identité externe.
Le client OpenID dans keycloak est le même client utilisé par l'application d'utilisateur final. Les URL de redirection renvoient l'utilisateur à l'application, qui transmet ensuite le jeton JWT à AWS pour échanger des informations d'identification AWS.
Cognito s'appuie sur l'application cliente dirigeant d'abord l'utilisateur vers le fournisseur d'authentification de son choix (dans ce cas, Keycloak), puis passant le jeton d'accès de Keycloak à Cognito qui l'utilise pour 1) créer une identité si nécessaire, et 2) générer Informations d'identification AWS pour l'accès au rôle AWS pour les utilisateurs "authentifiés" dans Cognito.
Un exemple utilisant l'AWS CLI: (remplacez ap-sud-est-2 dans les exemples par votre région locale)
Pré-site: l'application cliente obtient un jeton d'accès JWT pour l'utilisateur final à l'aide de toute méthode d'authentification OpenID
Créez ou récupérez une identité depuis cognito:
aws cognito-identity get-id --cli-input-json file://test.json
Renvoie l'identité:
{
"IdentityId": "ap-southeast-2:<identity_uuid>"
}
test.json
contient les détails du compte AWS, du pool de cognito et du jeton d'accès JWT de l'utilisateur à partir de keycloak:
{
"AccountId": "123456789012",
"IdentityPoolId": "ap-southeast-2:<cognito-identity-pool-uuid>",
"Logins": {
"keycloak.url/auth/realms/realmname": "<access_token_jwt>"
}
}
L'application peut ensuite utiliser cette identité retournée, ainsi que le jeton d'accès JWT pour obtenir les informations d'identification AWS avec lesquelles utiliser les services AWS ...
aws cognito-identity get-credentials-for-identity --identity-id ap-southeast-2:<identity_uuid> --cli-input-json file://test2.json
Renvoie un AccessKeyId, un SecretKey et un AWS SessionToken avec une heure d'expiration. Ceux-ci peuvent être utilisés pour accéder aux services AWS en fonction des autorisations du rôle authentifié qui a été établi dans le paramètre du pool d'identités fédérées Cognito:
{
"Credentials": {
"SecretKey": "<secret_key>",
"SessionToken": "<aws_cli_session_token>",
"Expiration": 1567891234.0,
"AccessKeyId": "<access_key>"
},
"IdentityId": "ap-southeast-2:<identity_uuid>"
}
Le contenu de test2.json
{
"IdentityId": "ap-southeast-2:<identity_uuid>",
"Logins": {
"keycloak.url/auth/realms/realmname": "<keycloak_access_token_jwt>"
}
}
J'espère que cela fournira un contexte et une assistance aux personnes qui tomberont sur cette question à l'avenir.