Keycloakで管理されるIDと認証を持つユーザーベースがあります。 OpenID Connectフェデレーションを使用して、これらのユーザーがCognitoでAWS API Gatewayサービスにログインして使用できるようにします。
OpenID Connectプロバイダーの使用に関するAWSドキュメントはやや欠けています。 古い参照 をSAMLを使用して見つけましたが、これを避けてOpenID Connectを使用することを好みます。
誰かがこれを達成した場合、彼らはkeycloak管理者の観点からいくつかの簡単な指示を書くことを気にしますか?
AWSサポートから受け取ったアドバイスに基づいて、将来の検索者のために自分の質問に答える:
質問自体は誤解に基づいていました。 AWS CognitoはKeycloakでユーザーを認証しません-クライアントアプリケーションが認証します。
Cognito Identity Federationは、外部IDプロバイダーからのトークンを使用してIDへのAWSアクセス認証情報を作成することにより、AWSリソースへのアクセスを許可することです。
KeycloakのOpenIDクライアントは、エンドユーザーアプリケーションで使用される同一のクライアントです。リダイレクトURLはユーザーをアプリケーションに送り返し、アプリケーションはJWTトークンをAWSに渡してAWS認証情報と交換します。
Cognitoはクライアントアプリに依存して、まずユーザーを選択した認証プロバイダー(この場合はKeycloak)に誘導し、次にアクセストークンをKeycloakからCognitoに渡します。Cognitoはそれを使用して1)必要に応じてIDを作成し、2)生成しますCognitoの「認証済み」ユーザーのAWSロールにアクセスするためのAWS認証情報。
AWS CLIを使用した例:(例のap-southeast-2をお住まいの地域に置き換えてください)
Prerequsite:クライアントアプリは、OpenID認証方法を使用してエンドユーザーのJWTアクセストークンを取得します
CognitoからIDを作成または取得します。
aws cognito-identity get-id --cli-input-json file://test.json
アイデンティティを返します。
{
"IdentityId": "ap-southeast-2:<identity_uuid>"
}
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>"
}
}
アプリは、この返されたIDと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フェデレーションIDプールの設定で確立された認証済みロールのアクセス許可に応じて、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>"
}
}
これが将来この質問に出くわした人々に背景と支援を提供することを願っています。