Amazon CognitoとOpenID Connect Providerを連携する
Amazon Cognitoと外部のOpenID Connect Provider(OP)を連携する方法を簡単にまとめる。
前提条件
Amazon CognitoのHosted UIを使ってユーザー認証できる状態にしておく。
-
OmniAuthでAmazon Cognitoを使う
- この記事ではRailsとOmniAuthを使っているが、もちろん任意のアプリケーションで問題ない
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を自分で入力する
- 「発行者URLを通じた自動入力」を使う場合は、OPで生成された
入力が終わったら「アイデンティティプロバイダーを登録する」ボタンを押して登録を完了する。
アプリケーションの設定
ホストされたUIで登録したプロバイダーをアプリケーションの認証で使うためには、登録する必要がある。ユーザープールの「アプリケーション統合」から、対象のアプリケーションの「ホストされたUI」の設定を開き、「IDプロバイダー」のリストから登録したプロバイダーを追加する。
以上で設定は完了。
試す
Cognitoで認証をしようとすると、登録したプロバイダーのボタンが左側に表示される。このボタンを押すと、P14Eの認証ページが表示される。そこで認証を完了すると、アプリケーションへのサインインが完了する。
Cognitoでのユーザーの状態
外部プロバイダーで認証したユーザーは、自動的にCognitoのユーザープールに登録される。デフォルトでは、同じメールアドレスでも別のプロバイダーで認証した場合は、別ユーザーとして扱われる。アカウントリンク機能を使うと、同じユーザーとしてまとめることもできるようになっている。
アカウントのリンクと、外部プロバイダーの属性とのマッピングについては、別途検証してみたい。
Discussion