Amazon Cognito User PoolにIdentity ProviderとしてOktaを追加することにより、ユーザー認証が可能なのか調べる機会がありました。今回はOktaで管理されているユーザーを用いてService Provider(Cognito)経由でサインインし、ユーザー認証後の処理としてCognitoからアクセストークンの取得を試みました。
やりたいこと
Cognitoに新規ユーザーを作成する事なく、作成済みのOktaユーザーを利用してユーザー認証を行い、SAML認証応答をCognitoに送信しアクセストークンを取得してみたいと思います。今回行う要求応答についての関係性は下記図を想定しています。
事前準備
Cognitoでユーザープールを作成しておきます。
Oktaの設定
SAMLアプリ統合を作成
OktaダッシュボードからApplicationsを展開し「Create App Integration」をクリックすると下記図が表示されます。今回はIdentity Provider(Okta)⇔Service Provider(Cognito)間でSAML認証を行う為、「SAML2.0」を選択し、次のページで任意のアプリケーション名を入力して進めます。
SAML 2.0セットアップ
SAMLアプリ統合内の設定として、Service Provider(Cognito)に関する設定を行います。ここでは、事前準備で作成したCognitoの情報を以下の形式で入力します。
- Single sign-on URL https://<Your user pool domain>/saml2/idpresponse
- Audience URI (SP Entity ID) urn:amazon:cognito:sp:<region_EXAMPLE>
ユーザープロファイル属性の設定
SAML Settingsにおける属性ステートメントはService Providerに提供される属性となります。Service Provider⇔Identity Provider間で認証に必要となるユーザー情報として、今回はName属性を1つだけ(email)設定して、SAMLアプリ統合を作成します。
SAMLメタデータを取得
SAMLアプリ統合内「SAML Signing Certificates」のType「SHA-2」のActionsより[View IdP metadata]を確認し、表示された内容を拡張子xmlとして保存します。
認証用ユーザーのアサイン
OktaユーザーをSAMLアプリ統合にアサインします。「Assignments」タブより、「Assign」をクリックし、「Assign to People」画面で認証用ユーザーのアサインを行います。
Amazon Cognitoの設定
CognitoでOktaをIdentity Providerとして設定
Cognitoの「サインインエクスペリエンス」タブより、「フェデレーテッドアイデンティティプロバイダーのサインイン」から「アイデンティティプロバイダーの追加」をクリックし、アイデンティティプロバイダーにSAMLを指定し、プロバイダー名を入力します。
SAML属性の設定
Okta側で取得したSAMLメタデータのxmlファイルをアップロードします。
次にOktaからのSAMLアサーションに含まれるSAML属性をCognitoユーザープール属性にマッピングします。
アプリクライアントの作成と設定
Cognitoのユーザープールでアプリクライアントを作成し、認証情報を設定します。
注意点としては、ホストされたUI設定内で、「許可されているコールバック URL」に任意のクライアントアプリケーションのURLを指定します。本設定を行わない場合、ユーザー認証後のリダイレクト先が無く処理が止まるので、忘れずに設定します。
クライアントの設定
クライアントアプリケーションの設定
クライアントアプリケーションからCognitoユーザープールのフェデレーションエンドポイントを呼び出す設定をします。
動作確認
Oktaユーザーによる認証リクエスト
クライアントアプリケーション(今回はPostman)からCognitoフェデレーションエンドポイントを呼び出すとOktaへリダイレクトされ、折り返してサインイン画面が表示されるので、Oktaに登録されているユーザー情報を入力してサインインします。
アクセストークンの取得およびCognitoの状態確認
Oktaでユーザー認証結果をクライアントアプリケーションで受け取り、Cognitoにリダイレクトします。CognitoでAuthorization Codeの確認を行い問題無ければクライアントアプリケーションにアクセストークンを送信します。
Oktaユーザーで認証を行う場合、ユーザー状態はどのように認識されるのか確認したところ、「確認ステータス」で「外部プロバイダー」と表示されており、Cognito User Pool内部に作成されたユーザーとは識別できそうです。
まとめ
本記事では、Amazon Cognito User PoolのIdentity ProviderにOktaをセットアップし、以下の流れを試しました。
- Client ApplicationからService Providerのフェデレーションエンドポイントを呼び出す。
- Service Providerはユーザー認証要求をIdentity Providerにリダイレクトする。
- Client ApplicationからIdentity Providerのログイン画面でIdentity Providerに所属するユーザーを利用してログインする。
- Identity Providerでユーザー認証応答を作成する。
- Identity ProviderからClient ApplicationへSAML認証応答の送信を行う。
- Client ApplicationからService ProviderへSAML認証応答を送信する。
- Service ProviderでSAML認証応答を検証し、検証結果をClient Applicationへ返却する。
- Client ApplicationからService Providerへアクセストークンを要求・応答を受け取る。
以上の結果から、Amazon Cognitoに新規ユーザーを作成する事なく、作成済みのOktaユーザーを利用してユーザー認証を行い、アクセストークンを取得する事ができました。