如何在Keycloak中创建客户端以与AWS Cognito Identity Federation一起使用

sho*_*ser 21 amazon-web-services single-sign-on openid-connect amazon-cognito keycloak

我有一个用户群,其中包含由keycloak管理的身份和身份验证.我想允许这些用户使用OpenID Connect联合登录并使用Cognito的AWS API网关服务.

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

如果有人实现了这一点,他们会介意从keycloak管理员角度编写一些简单的指令吗?

sho*_*ser 12

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

这个问题本身就是基于一种误解.AWS Cognito不会使用Keycloak对用户进行身份验证 - 客户端应用程序会执行此操作.

Cognito Identity Federation旨在通过使用来自外部身份提供商的令牌为身份创建AWS Access凭据来授予对AWS资源的访问权限.

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

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

使用AWS CLI的示例:(在示例中用本地区域替换ap-southeast-2)

Prerequsite:客户端应用程序使用任何OpenID身份验证方法为最终用户获取JWT访问令牌

从cognito创建或检索身份:

aws cognito-identity get-id --cli-input-json file://test.json
Run Code Online (Sandbox Code Playgroud)

返回标识:

{
    "IdentityId": "ap-southeast-2:<identity_uuid>"
}
Run Code Online (Sandbox Code Playgroud)

test.json 包含AWS账户中,cognito池,并从keycloak用户的智威汤逊访问令牌的详细信息:

{
    "AccountId": "123456789012",
    "IdentityPoolId": "ap-southeast-2:<cognito-identity-pool-uuid>",
    "Logins": {
        "keycloak.url/auth/realms/realmname": "<access_token_jwt>"
     }
}
Run Code Online (Sandbox Code Playgroud)

然后,应用程序可以使用此返回的标识以及JWT访问令牌来获取用于使用AWS服务的AWS凭据...

aws cognito-identity get-credentials-for-identity --identity-id ap-southeast-2:<identity_uuid> --cli-input-json file://test2.json
Run Code Online (Sandbox Code Playgroud)

返回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>"
}
Run Code Online (Sandbox Code Playgroud)

的内容 test2.json

{
    "IdentityId": "ap-southeast-2:<identity_uuid>",
    "Logins": {
        "keycloak.url/auth/realms/realmname": "<keycloak_access_token_jwt>"
    }
}
Run Code Online (Sandbox Code Playgroud)

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