CognitoにOpenID Connectを使ってKeycloakを連携させてみる

Cognitoユーザープールは、OpenID Connect(以降、OIDC)プロバイダーを追加可能で、OIDCに準拠したアカウントをCognitoユーザープールに紐付けることができます。

弊社ブログでもLINEアカウントと連携した例を紹介しています。

本ブログでは、KeycloakとCognitoユーザープールを連携する例を紹介します。

ゴール

Cognitoでこんな感じのログイン画面だして。

Keycloakにフェデレーションしてログインして。

ログイン後の画面を出すことです。

AWS構成図

こんな感じの構成を作ります。

作業手順

作業として大まかに次の6つの作業があります。

  1. Amazon Cognito ユーザープールを作成する
  2. Amazon Cognito ユーザープールを設定する
  3. ALBとCognitoを組み合わせた認証を設定する
  4. Keycloakを構築する
  5. KeycloakのOIDCクライアントを作成する
  6. Amazon Cognito ユーザープールの外部IDプロバイダを設定する

13については、ALBとCognitoを組み合わせた認証について書かれたこちらのブログを参考に構築してください。

4のKeycloakの構築については、先日ブログを書いたのでこちらをご参照ください。

ここからは、56の作業について解説していきます。

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連携を検証したいときに役立つと思います。