如何在 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.json
和test2.json
文件的内容:关键真的是keycloak.url/auth/realms/realmname
吗?还是不用替换keycloak.url
和realmname
?
access_token_jwt 引用不正确,Cognito 只支持 IAM 角色交换身份令牌,不支持访问令牌。以上是关于如何在 Keycloak 中创建客户端以与 AWS Cognito 身份联合使用的主要内容,如果未能解决你的问题,请参考以下文章
通过 keycloak admin 客户端在 keycloak 中创建用户返回 IllegalArgumentException