CognitoにOpenID Connectを使ってKeycloakを連携させてみる
Cognitoユーザープールは、OpenID Connect(以降、OIDC)プロバイダーを追加可能で、OIDCに準拠したアカウントをCognitoユーザープールに紐付けることができます。
弊社ブログでもLINEアカウントと連携した例を紹介しています。
本ブログでは、KeycloakとCognitoユーザープールを連携する例を紹介します。
ゴール
Cognitoでこんな感じのログイン画面だして。
Keycloakにフェデレーションしてログインして。
ログイン後の画面を出すことです。
AWS構成図
こんな感じの構成を作ります。
作業手順
作業として大まかに次の6つの作業があります。
- Amazon Cognito ユーザープールを作成する
- Amazon Cognito ユーザープールを設定する
- ALBとCognitoを組み合わせた認証を設定する
- Keycloakを構築する
- KeycloakのOIDCクライアントを作成する
- Amazon Cognito ユーザープールの外部IDプロバイダを設定する
1〜3については、ALBとCognitoを組み合わせた認証について書かれたこちらのブログを参考に構築してください。
- インフラエンジニアが一切コードを書かずにWebサーバーに認証機能を実装した話 | DevelopersIO
- ALB + Cognito認証で付与されるユーザー情報をEC2サイドから眺めてみる | DevelopersIO
4のKeycloakの構築については、先日ブログを書いたのでこちらをご参照ください。
ここからは、5〜6の作業について解説していきます。
KeycloakのOIDCクライアントを作成する
Keycloakで適当なrealm(今回は dev
)を作成して、新しくOIDC用のクライアント(今回は cognito-oidc
)を作成します。
クライアントが作成できたら、次のように設定を変えていきます。
- Client Protocol: openid-connect
- AccessType: confidential
Cognito用のリダイレクトURIを設定して、Saveします。
- Valid Redirect URIs: https://
<your-user-pool-domain>
/oauth2/idpresponse
参考: ユーザープールへの OIDC ID プロバイダーの追加 - Amazon Cognito
その後、Credentialsタブを開いて、Secretの値をメモしておいてください。Cognitoユーザープール側の設定で使用します。
Amazon Cognito ユーザープールの外部IDプロバイダーを設定する
Cognito ユーザープールのマネジメントコンソール画面から、外部IDプロバイダーを設定します。
各項目を次のように設定していきます。
- プロバイダ名:Cognitoユーザープール向けの識別子なので好きな名前をつけてください(今回は
keycloak-oidc
) - クライアントID:Keycloakで設定したクライアントIDを利用
- クライアントのシークレット:KeycloakでメモしたSecretを利用
- 属性のリクエストメソッド:GET
- 承認スコープ:openid email profile
- 発行者:※Keycloakから確認できます。のちほど説明します。
発行者を設定したら、検出の実行をして、openid設定エンドポイントが正常に取得できることを確認します。
その後、プロバイダーの作成をします。
※発行者の確認方法
Keycloakの Realm Settings
から確認できます。
OpenID Endpoint Configuration
を開いてから、 issuer
のURLをそのまま設定してください。
IDプロバイダーの作成が終わったら、属性マッピングの設定をします。
CognitoでEmailの設定を必須にしているので、Keycloakから受け取るemailとCognitoのEmailの属性をマッピングします。
その後、プロバイダーを発行したことによって、アプリクライアントの設定画面に、有効なIDプロバイダの選択肢が増えています。
増えた有効なIDプロバイダ(今回は keycloak-oidc
)にチェックを入れて変更を保存します。
これで設定は完了です。
動作確認
Cognito認証を設定したALBにアクセスすると、Cognitoのログイン画面に転送されます。 そうすると、Keycloakで認証するためのボタンが増えています。
「keycloak-oidc」ボタンを押すと、Keycloakのログイン画面に転送されます。
KeycloakのユーザーIDでログインすると、無事にログイン後の画面を出すことができました。
マネジメントコンソールから、Cognitoユーザープールのユーザーが追加されていることも確認できます。
ユーザー情報を見てみると、属性マッピングで指定していたように、Keycloakのユーザーで設定したE-mailアドレスが設定されていることも確認できます。
終わりに
CognitoユーザープールにOpenID Connectを使ってKeycloakを連携させてみました。
今回はKeycloakを利用しましたが、OIDCに準拠していれば他のアカウントでもCognitoユーザープールと連携できます。
Keycloakを利用することで、プロバイダ側の設定をいろいろいじることができ、CognitoのOIDC連携を検証したいときに役立つと思います。