如何在 Keycloak 中创建客户端以与 AWS Cognito Identity Federation 一起使用
How to Create a Client in Keycloak to use with AWS Cognito Identity Federation
我有一个用户群,其身份和身份验证由 keycloak 管理。我想允许这些用户使用 OpenID Connect 联合登录并使用 AWS API 网关服务和 Cognito。
关于使用 OpenID Connect 提供程序的 AWS 文档有些缺乏。我找到了一个使用 SAML 的 old reference,但我更愿意避免这种情况并使用 OpenID Connect。
如果有人做到了这一点,他们会介意从 keycloak 管理员的角度写一些简单的说明吗?
根据我从 AWS Support 收到的建议为未来的搜索者回答我自己的问题:
问题本身是基于误解。 AWS Cognito 不使用 Keycloak 对用户进行身份验证 - 客户端应用程序执行此操作。
Cognito Identity Federation 是关于通过使用来自外部身份提供商的令牌为身份创建 AWS 访问凭证来授予对 AWS 资源的访问权限。
keycloak 中的 OpenID 客户端是最终用户应用程序使用的同一个客户端。重定向 URL 将用户发送回应用程序,然后应用程序将 JWT 令牌传递给 AWS 以交换 AWS 凭证。
Cognito 依赖于客户端应用程序,首先将用户定向到他们选择的身份验证提供程序(在本例中为 Keycloak),然后将访问令牌从 Keycloak 传递给 Cognito,Cognito 使用它来 1) 在需要时创建身份,以及 2) 为 Cognito 中的“已验证”用户生成 AWS 凭证以访问 AWS 角色。
使用 AWS CLI 的示例
先决条件:客户端应用使用任何 OpenID 身份验证方法为最终用户获取 JWT 访问令牌
从 Cognito 创建或检索身份:
aws cognito-identity get-id --cli-input-json file://test.json
Returns身份:
{
"IdentityId": "ap-southeast-2:<identity_uuid>"
}
(将示例中的 ap-southeast-2
替换为您所在的地区)
test.json
包含来自 Keycloak 的 AWS 帐户、Cognito 池和用户的 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
Returns 一个 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>"
}
}
我希望这能为将来遇到这个问题的人提供背景和帮助。
我有一个用户群,其身份和身份验证由 keycloak 管理。我想允许这些用户使用 OpenID Connect 联合登录并使用 AWS API 网关服务和 Cognito。
关于使用 OpenID Connect 提供程序的 AWS 文档有些缺乏。我找到了一个使用 SAML 的 old reference,但我更愿意避免这种情况并使用 OpenID Connect。
如果有人做到了这一点,他们会介意从 keycloak 管理员的角度写一些简单的说明吗?
根据我从 AWS Support 收到的建议为未来的搜索者回答我自己的问题:
问题本身是基于误解。 AWS Cognito 不使用 Keycloak 对用户进行身份验证 - 客户端应用程序执行此操作。
Cognito Identity Federation 是关于通过使用来自外部身份提供商的令牌为身份创建 AWS 访问凭证来授予对 AWS 资源的访问权限。
keycloak 中的 OpenID 客户端是最终用户应用程序使用的同一个客户端。重定向 URL 将用户发送回应用程序,然后应用程序将 JWT 令牌传递给 AWS 以交换 AWS 凭证。
Cognito 依赖于客户端应用程序,首先将用户定向到他们选择的身份验证提供程序(在本例中为 Keycloak),然后将访问令牌从 Keycloak 传递给 Cognito,Cognito 使用它来 1) 在需要时创建身份,以及 2) 为 Cognito 中的“已验证”用户生成 AWS 凭证以访问 AWS 角色。
使用 AWS CLI 的示例
先决条件:客户端应用使用任何 OpenID 身份验证方法为最终用户获取 JWT 访问令牌
从 Cognito 创建或检索身份:
aws cognito-identity get-id --cli-input-json file://test.json
Returns身份:
{
"IdentityId": "ap-southeast-2:<identity_uuid>"
}
(将示例中的 ap-southeast-2
替换为您所在的地区)
test.json
包含来自 Keycloak 的 AWS 帐户、Cognito 池和用户的 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
Returns 一个 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>"
}
}
我希望这能为将来遇到这个问题的人提供背景和帮助。