根据我从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.json
和test2.json
文件内容:键名真的是keycloak.url/auth/realms/realmname
吗?或者您需要替换keycloak.url
和realmname
吗? - Peter Wippermann