如何在 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>"
    }
}

我希望这能为将来遇到这个问题的人提供背景和帮助。