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

30
我有一个用户基础,其身份验证和认证是由Keycloak管理的。我想允许这些用户使用OpenID Connect联合,通过Cognito登录并使用AWS API网关服务。
AWS有关使用OpenID Connect提供程序的文档有点缺乏。我找到了一个旧的参考,使用SAML,但我更喜欢避免这种方法,改用OpenID Connect。
如果有任何人已经实现了这个功能,请从Keycloak管理员角度编写一些简单的说明书吗?
1个回答

31

根据我从AWS支持团队接受的建议,为了未来的搜索者回答自己的问题:

这个问题本身是基于一个误解。AWS Cognito不与Keycloak一起验证用户-客户端应用程序会处理此事。

Cognito身份联合旨在通过使用来自外部身份提供者的令牌创建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

返回身份:

{
    "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以及过期时间。根据在Cognito联合身份池设置中建立的已验证角色的权限,可以使用它们来访问AWS服务:

{
    "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 吗? - Peter Wippermann
access_token_jwt 的引用不正确,Cognito 仅支持交换身份令牌以获取 IAM 角色,而不是访问令牌。 - Marius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接