👥

Amazon CognitoとOpenID Connect Providerを連携する

2023/12/15に公開

Amazon Cognitoと外部のOpenID Connect Provider(OP)を連携する方法を簡単にまとめる。

前提条件

Amazon CognitoのHosted UIを使ってユーザー認証できる状態にしておく。

OPの設定

事情により、今回利用するOPは、PingOne for Enterpriseというマイナーなものを使う。Entra IDとかOktaとか、一般的なOPを使う場合は、適宜読み替えて欲しい。

アプリケーション登録

アプリケーションの種類の選択

PingOne for Enterprise(P14E)で、OIDCアプリケーションを新規登録しようとすると、アプリケーションの種類を選ぶように選択肢が出てくる。今回は標準的なWebアプリケーションなので、WEB APPを選択する。

アプリケーションの基本情報

アプリの名前と詳細、カテゴリー、アイコンを設定する。

認可設定

ここでは特に設定は変更しない。Add Secretボタンを押してCLIENT SECRETSを生成した後、以下の情報を控える。

  • CLIENT ID
  • CLIENT SECRETS

SSOフローと認証の設定

Start SSO URLにはアプリのURL、Redirect URIsにOIDCのcallback URLを入力する。

Callback URLsは、Amazon Cognitoを使う場合は、下記のようになる。

  • https://<your-user-pool-domain>/oauth2/idpresponse
    • <your-user-pool-domain>の部分は、AWS Management Consoleで、ユーザープールの中にある「アプリケーション統合」のタブに記載されているので、それを参照する。

デフォルトユーザープロファイルの属性の設定

Cognitoと最低限連携するだけなら、デフォルトのままで問題ない。

Scopeの設定

OIDCのScopeを設定する。openid, profile, emailを有効にする。

属性マッピング

Cognitoと連携したい属性を設定する。これはCognito側でも同様の設定が必要になる。

グループ設定

アプリケーションを利用できるユーザーが含まれる、P14Eにあるグループを選択する。

以上で、P14Eでのアプリケーションの設定は完了。

Cognitoの設定

  • AWS Management Consoleで、対象となるユーザープールの設定から「サインインエクスペリエンス」を開く。
  • 「フェデレーテッドアイデンティティプロバイダーのサインイン」にある「アイデンティティプロバイダーを追加」ボタンを押す。

OpenID Connectの設定

プロバイダーのリストの中から、OpenID Connectを選択すると、OIDCの設定画面が出てくる。

  • プロバイダー名
    • 任意の名前を入れる。認証時に使われるURLにパラメータとして含まれるので、URLで使えない値は使えない
  • クライアントID
    • OPで生成された値を入れる
  • クライアントシークレット
    • OPで生成された値を入れる
  • 許可されたスコープ
    • 今回は openid profile emailを使う
  • 発行者URL
    • 「発行者URLを通じた自動入力」を使う場合は、OPで生成されたIssuerを使う
    • 自動入力がうまくいかない場合は「手動入力」を選択して、ここのURLを自分で入力する

入力が終わったら「アイデンティティプロバイダーを登録する」ボタンを押して登録を完了する。

アプリケーションの設定

ホストされたUIで登録したプロバイダーをアプリケーションの認証で使うためには、登録する必要がある。ユーザープールの「アプリケーション統合」から、対象のアプリケーションの「ホストされたUI」の設定を開き、「IDプロバイダー」のリストから登録したプロバイダーを追加する。

以上で設定は完了。

試す

Cognitoで認証をしようとすると、登録したプロバイダーのボタンが左側に表示される。このボタンを押すと、P14Eの認証ページが表示される。そこで認証を完了すると、アプリケーションへのサインインが完了する。

Cognitoでのユーザーの状態

外部プロバイダーで認証したユーザーは、自動的にCognitoのユーザープールに登録される。デフォルトでは、同じメールアドレスでも別のプロバイダーで認証した場合は、別ユーザーとして扱われる。アカウントリンク機能を使うと、同じユーザーとしてまとめることもできるようになっている。

アカウントのリンクと、外部プロバイダーの属性とのマッピングについては、別途検証してみたい。

参考情報

Discussion