如何在 Keycloak 中创建客户端以与 AWS Cognito 身份联合使用

Posted

技术标签:

【中文标题】如何在 Keycloak 中创建客户端以与 AWS Cognito 身份联合使用【英文标题】:How to Create a Client in Keycloak to use with AWS Cognito Identity Federation 【发布时间】:2018-09-23 10:04:30 【问题描述】:

我有一个用户群,其身份和身份验证由 keycloak 管理。我希望允许这些用户使用 OpenID Connect 联合登录并使用带有 Cognito 的 AWS API Gateway 服务。

关于使用 OpenID Connect 提供程序的 AWS 文档有些缺乏。我使用 SAML 找到了一个 old reference,但我更愿意避免这种情况并使用 OpenID Connect。

如果有人做到了这一点,他们介意从 keycloak 管理员的角度写一些简单的说明吗?

【问题讨论】:

【参考方案1】:

根据我从 AWS Support 收到的建议为未来的搜索者回答我自己的问题:

问题本身是基于误解。 AWS Cognito 不会使用 Keycloak 对用户进行身份验证 - 客户端应用程序会这样做。

Cognito Identity Federation 是关于通过使用来自外部身份提供商的令牌创建 AWS 访问凭证来授予对 AWS 资源的访问权限。

keycloak 中的 OpenID 客户端是最终用户应用程序使用的同一个客户端。重定向 URL 将用户发送回应用程序,然后应用程序将 JWT 令牌传递给 AWS 以交换 AWS 凭证。

Cognito 依赖于客户端应用程序,首先将用户引导到他们选择的身份验证提供程序(在本例中为 Keycloak),然后将访问令牌从 Keycloak 传递给 Cognito,Cognito 使用它来 1) 在需要时创建身份,以及2) 为 Cognito 中的“Authenticated”用户生成 AWS 凭证以访问 AWS 角色。

使用 AWS CLI 的示例

先决条件:客户端应用使用任何 OpenID 身份验证方法为最终用户获取 JWT 访问令牌

从 cognito 创建或检索身份:

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

返回身份:


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

(将示例中的 ap-southeast-2 替换为您所在的地区)

test.json 包含 AWS 账户、Cognito 池和来自 Keycloak 的用户 JWT 访问令牌的详细信息:


    "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 联合身份池的设置中建立的经过身份验证的角色的权限:


    "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>"
    

我希望这能为将来偶然发现这个问题的人提供背景信息和帮助。

【讨论】:

关于你的test.jsontest2.json文件的内容:关键真的是keycloak.url/auth/realms/realmname吗?还是不用替换keycloak.urlrealmname access_token_jwt 引用不正确,Cognito 只支持 IAM 角色交换身份令牌,不支持访问令牌。

以上是关于如何在 Keycloak 中创建客户端以与 AWS Cognito 身份联合使用的主要内容,如果未能解决你的问题,请参考以下文章

通过 keycloak admin 客户端在 keycloak 中创建用户返回 IllegalArgumentException

如何在 Keycloak 中创建脚本映射器?

Keycloak - 在领域中创建管理员用户

如何使用 REST API 在 Keycloak 中创建具有密码的用户?

无法在 keycloak 中创建初始管理员用户

如何在 AWS 中创建计费用户 [关闭]