Amazon Cognito + Oktaの構成でSAML認証によりアクセストークンを取得してみた

Amazon Cognito User PoolにIdentity ProviderとしてOktaを追加することにより、ユーザー認証が可能なのか調べる機会がありました。今回はOktaで管理されているユーザーを用いてService Provider(Cognito)経由でサインインし、ユーザー認証後の処理としてCognitoからアクセストークンの取得を試みました。

やりたいこと

Cognitoに新規ユーザーを作成する事なく、作成済みのOktaユーザーを利用してユーザー認証を行い、SAML認証応答をCognitoに送信しアクセストークンを取得してみたいと思います。今回行う要求応答についての関係性は下記図を想定しています。

image2

 

事前準備

Cognitoでユーザープールを作成しておきます。

チュートリアル: ユーザープールの作成 - Amazon Cognito
ユーザープールを使用すると、ユーザーは Amazon Cognito 経由でウェブまたはモバイルアプリにログインできます。

 

Oktaの設定

SAMLアプリ統合を作成

OktaダッシュボードからApplicationsを展開し「Create App Integration」をクリックすると下記図が表示されます。今回はIdentity Provider(Okta)⇔Service Provider(Cognito)間でSAML認証を行う為、「SAML2.0」を選択し、次のページで任意のアプリケーション名を入力して進めます。

Create new App

SAMLアプリ統合を作成する | Okta

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>

Create SAML Integration

ユーザープールへの SAML ID プロバイダーの追加 - Amazon Cognito
ユーザープールへの SAML ID プロバイダーの追加。

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

SAML Settingsにおける属性ステートメントはService Providerに提供される属性となります。Service Provider⇔Identity Provider間で認証に必要となるユーザー情報として、今回はName属性を1つだけ(email)設定して、SAMLアプリ統合を作成します。

Attribute Statements

SAMLメタデータを取得

SAMLアプリ統合内「SAML Signing Certificates」のType「SHA-2」のActionsより[View IdP metadata]を確認し、表示された内容を拡張子xmlとして保存します。

IdP metadata

認証用ユーザーのアサイン

OktaユーザーをSAMLアプリ統合にアサインします。「Assignments」タブより、「Assign」をクリックし、「Assign to People」画面で認証用ユーザーのアサインを行います。

Assign to people

 

Amazon Cognitoの設定

CognitoでOktaをIdentity Providerとして設定

Cognitoの「サインインエクスペリエンス」タブより、「フェデレーテッドアイデンティティプロバイダーのサインイン」から「アイデンティティプロバイダーの追加」をクリックし、アイデンティティプロバイダーにSAMLを指定し、プロバイダー名を入力します。

Add identity provider

SAML属性の設定

Okta側で取得したSAMLメタデータのxmlファイルをアップロードします。
次にOktaからのSAMLアサーションに含まれるSAML属性をCognitoユーザープール属性にマッピングします。

metadata&Attribute

アプリクライアントの作成と設定

Cognitoのユーザープールでアプリクライアントを作成し、認証情報を設定します。

注意点としては、ホストされたUI設定内で、「許可されているコールバック URL」に任意のクライアントアプリケーションのURLを指定します。本設定を行わない場合、ユーザー認証後のリダイレクト先が無く処理が止まるので、忘れずに設定します。

Amazon Cognito でホストされた UI およびフェデレーションエンドポイントの設定と使用 - Amazon Cognito
モバイルまたはウェブアプリの Amazon Cognito ユーザープールへの統合

 

クライアントの設定

クライアントアプリケーションの設定

クライアントアプリケーションからCognitoユーザープールのフェデレーションエンドポイントを呼び出す設定をします。

OAuth 2.0、OpenID Connect、および SAML 2.0 フェデレーションエンドポイントリファレンス - Amazon Cognito
このドキュメントでは、Amazon Cognito ユーザープールのホストされた UI、SAML 2.0、OpenID Connect、および OAuth 2.0 の認証および認可エンドポイントについて説明します。これらのエンドポイントは、...

 

動作確認

Oktaユーザーによる認証リクエスト

クライアントアプリケーション(今回はPostman)からCognitoフェデレーションエンドポイントを呼び出すとOktaへリダイレクトされ、折り返してサインイン画面が表示されるので、Oktaに登録されているユーザー情報を入力してサインインします。

userlogin

アクセストークンの取得およびCognitoの状態確認

Oktaでユーザー認証結果をクライアントアプリケーションで受け取り、Cognitoにリダイレクトします。CognitoでAuthorization Codeの確認を行い問題無ければクライアントアプリケーションにアクセストークンを送信します。

Authentication Complete

Oktaユーザーで認証を行う場合、ユーザー状態はどのように認識されるのか確認したところ、「確認ステータス」で「外部プロバイダー」と表示されており、Cognito User Pool内部に作成されたユーザーとは識別できそうです。

idPuser

 

まとめ

本記事では、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ユーザーを利用してユーザー認証を行い、アクセストークンを取得する事ができました。

著者について
Masato Kuroiwaをフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWS
シェアする
タイトルとURLをコピーしました