Comment créer un Client dans Keycloak à utiliser avec AWS Cognito Identity Federation

j'ai une base d'utilisateurs avec Identité et authentification gérée par keycloak. J'aimerais permettre à ces utilisateurs de se connecter et d'utiliser les services AWS API Gateway avec Cognito en utilisant une fédération OpenID Connect.

la documentation de L'AWS sur l'utilisation d'un fournisseur OpenID Connect manque quelque peu. J'ai trouvé un ancienne référence en utilisant SAML mais préférerait éviter cela et utiliser OpenID Connect.

si quelqu'un y est parvenu, cela lui dérangerait-il de rédiger un rapport simple instructions du point de vue de l'administrateur de keycloak?

13
demandé sur shonky linux user 2018-04-13 09:08:32

1 réponses

répondre à ma propre question pour les futurs chercheurs sur la base des conseils que j'ai reçus du soutien de L'AWS:

la question elle-même était basée sur un malentendu. AWS Cognito n'authentifie pas les utilisateurs avec Keycloak - l'application client le fait.

Cognito Identity Federation vise à accorder l'accès aux ressources AWS en créant des justificatifs D'accès AWS à une identité avec un jeton d'un fournisseur d'identité externe.

le client OpenID dans keycloak est le seul et même client utilisé par l'application utilisateur final. Les URL de Redirection renvoient l'utilisateur à l'application, qui passe ensuite le JWT token à AWS pour échanger les informations D'identification AWS.

Cognito s'appuie d'abord sur l'application client qui dirige l'utilisateur vers le fournisseur d'authentification de son choix (dans ce cas-ci Keycloak), puis passe 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 des justificatifs D'identité AWS pour accéder au rôle AWS pour les utilisateurs "authentifiés" à Cognito.

un exemple utilisant le CLI AWS: (remplacez ap-southeast-2 dans les exemples par votre région locale)

Prerequsite: l'application client obtient le token d'accès JWT pour l'utilisateur final en utilisant n'importe quelle méthode D'authentification OpenID

Créer ou de récupérer une identité à partir de 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, le cognito pool et le JWT access token de keycloak:

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

l'application peut alors utiliser cette identité retournée, ainsi que le JWT access token pour obtenir des justificatifs AWS avec lesquels consommer des 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,une clé secrète et une session AWS avec un temps d'expiration. Ceux-ci peuvent être utilisés pour accéder aux services AWS en fonction des permissions du rôle authentifié qui a été établi dans le cadre pour le Cognito L'Identité Fédérée Piscine:

{
    "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 de l'aide aux personnes qui trébuchent sur cette question à l'avenir.

3
répondu shonky linux user 2018-05-15 06:40:53