

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ユーザープールでの OIDC ID プロバイダーの使用
<a name="cognito-user-pools-oidc-idp"></a>

ユーザーは、OpenID Connect (OIDC) ID プロバイダー (IdP) の既存アカウントを使用してアプリケーションにサインインできます。OIDC プロバイダーを使用すると、独立したシングルサインオンシステムのユーザーは、アプリケーションがユーザープールの共有形式で OIDC トークンを受信する間、既存の認証情報を提供できます。OIDC IdP を設定するには、ユーザープールを RP として処理するように IdP を設定するとともに、ユーザープールを IdP として処理するようにアプリケーションを設定します。Amazon Cognito は、複数の OIDC IdP とアプリケーションの間の中間ステップとして機能します。ユーザープールは、プロバイダーがユーザープールに直接渡す ID トークンとアクセストークンのクレームに、属性マッピングルールを適用します。次に、Amazon Cognito は、マッピングされたユーザー属性と、[Lambda トリガー](cognito-user-pools-working-with-lambda-triggers.md#lambda-triggers-for-federated-users)を使用して認証フローに加えた追加の調整に基づいて、新しいトークンを発行します。

OIDC IdP でサインインするユーザーは、ユーザープールアプリケーションにアクセスするために、新しい認証情報や情報を提供する必要はありません。アプリケーションは、ユーザープールを使用して、サインインのために IdP にサイレントにリダイレクトできます。この場合、ユーザープールは、アプリケーションのトークン形式を標準化するバックグラウンドのツールとして使用されます。IdP リダイレクトの詳細については、「[認可エンドポイント](authorization-endpoint.md)」を参照してください。

他のサードパーティー ID プロバイダーと同様に、アプリケーションを OIDC プロバイダーに登録し、ユーザープールに接続する IdP アプリケーションに関する情報を取得する必要があります。ユーザープール OIDC IdP には、クライアント ID、クライアントシークレット、リクエストするスコープ、プロバイダーサービスエンドポイントに関する情報が必要です。ユーザープールが検出エンドポイントからプロバイダーの OIDC エンドポイントを検出すできますが、ユーザーが手動で入力することもできます。また、プロバイダー ID トークンを調べ、IdP とユーザープール内の属性に関して属性マッピングを作成する必要があります。

![\[OIDC ユーザープール IdP 認証フロー\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/flow-cup-oidc-endpoints.png)


この認証フローの詳細については、「[OIDC ユーザープール IdP 認証フロー](cognito-user-pools-oidc-flow.md)」を参照してください。

**注記**  
サードパーティー (フェデレーション) 経由のサインインは、Amazon Cognito のユーザープールで使用できます。この機能は、Amazon Cognito アイデンティティプールを使用した OIDC フェデレーションとは無関係です。

OIDC IdP は AWS マネジメントコンソール、、、またはユーザープール API メソッド [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) を使用して AWS CLI、ユーザープールに追加できます。

**Topics**
+ [

## 前提条件
](#cognito-user-pools-oidc-idp-prerequisites)
+ [

## アプリケーションを OIDC IdP に登録する
](#cognito-user-pools-oidc-idp-step-1)
+ [

## ユーザープールに OIDC IdP を追加する
](#cognito-user-pools-oidc-idp-step-2)
+ [

## OIDC IdP の設定をテストする
](#cognito-user-pools-oidc-idp-step-3)
+ [

# OIDC ユーザープール IdP 認証フロー
](cognito-user-pools-oidc-flow.md)

## 前提条件
<a name="cognito-user-pools-oidc-idp-prerequisites"></a>

開始するには、以下が必要です。
+ アプリケーションクライアントとユーザープールドメインを使用するユーザープール。詳細については、「[ユーザープールの作成](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)」を参照してください。
+ 次の設定を持つ OIDC IdP。
  + `client_secret_post` クライアント認証をサポートします。Amazon Cognito は、IdP の OIDC ディスカバリエンドポイントでの `token_endpoint_auth_methods_supported` クレームをチェックしません。Amazon Cognito は、`client_secret_basic` クライアント認証をサポートしていません。クライアント認証の詳細については、OpenID Connect ドキュメントの「[クライアント認証](https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication)」を参照してください。
  + `openid_configuration`、`userInfo`、および `jwks_uri` などの OIDC エンドポイントにのみ HTTPS を使用します。
  + OIDC エンドポイントには TCP ポート 80 および 443 のみを使用します。
  + HMAC-SHA、ECDSA または RSA アルゴリズムで ID トークンにのみ署名します。
  + キー ID `kid` クレームを `jwks_uri`  で発行し、そのトークンに `kid` クレームをフックみます。
  + 有効なルート CA トラストチェーンを持つ、有効期限が切れていないパブリックキーを表示します。

## アプリケーションを OIDC IdP に登録する
<a name="cognito-user-pools-oidc-idp-step-1"></a>

OIDC IdP をユーザープール設定に追加してアプリケーションクライアントに割り当てる前に、OIDC クライアントアプリケーションを IdP に設定します。ユーザープールは、依拠しているパーティのアプリケーションとして、IdP を使用して認証を管理します。

**OIDC IdP に登録する**

1. OIDC IdP のデベロッパーアカウントを作成します。  
**OIDC IdP へのリンク**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-oidc-idp.html)

1. OIDC IdP を使用して、`/oauth2/idpresponse` エンドポイントを持つユーザープールドメインを登録します。そうすることで、OIDC IdP が後ほど、ユーザーの認証時に Amazon Cognito からこれを受け入れることが確実になります。

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
   ```

1. ユーザーディレクトリとユーザープールで共有する[スコープ](cognito-user-pools-define-resource-servers.md#cognito-user-pools-define-resource-servers-about-scopes)を選択します。OIDC IdP がユーザー情報を提供するには、スコープとして **openid** が必要です。`email` スコープは、`email` および `email_verified` の [クレーム](https://openid.net/specs/openid-connect-basic-1_0.html#StandardClaims)へのアクセスを付与するために必要です。OIDC 仕様のその他のスコープは、すべてのユーザー属性のための `profile` と、`phone_number` および `phone_number_verified` のための `phone` です。

1. OIDC IdP は、クライアント ID とクライアントシークレットを提供します。これらの値をメモし、後でユーザープールに追加する OIDC IdP の設定に追加します。

**例: Salesforce を OIDC IdP としてユーザープールで使用する**

 OIDC 互換 IdP (Salesforce など) とユーザープールの間で信頼性を確立するときに OIDC IdP を使用します。

1. Salesforce 開発者ウェブサイトで[アカウントを作成](https://developer.salesforce.com/signup)します。

1. 前のステップで設定した開発者アカウントを使用して[サインイン](https://developer.salesforce.com)します。

1. Salesforce ページで、次のいずれかの操作を行います。
   +  Lightning Experience を使用している場合は、歯車アイコンを選択してから、**[Setup Home]** (ホームの設定) を選択します。
   +  Salesforce Classic を使用しており、ユーザーインターフェイスのヘッダーに [**Setup (設定)**] が表示されている場合は、選択します。
   +  Salesforce Classic を使用しており、ヘッダーに [**Setup (設定)**] が表示されていない場合は、上部のナビゲーションバーで名前を選択し、ドロップダウンリストより [**Setup (設定)**] を選択します。

1. 左のナビゲーションバーで、[**Company Settings (組織の設定)**] を選択します。

1. ナビゲーションバーで、**[Domain]** (ドメイン) を選択してドメインを入力し、**[Create]** (作成) を入力します。

1. 左のナビゲーションバーで、**[Platform Tools]** (プラットフォームツール) に移動し、**[Apps]** (アプリケーション) を選択します。

1. [**アプリケーションマネージャ**] を選択します。

1. 

   1. **[New connected app]** (新規接続アプリケーション) を選択します。

   1. 必須フィールドに入力します。

      **[Start URL]** (開始 URL) で、Salesforce IdP でサインインするユーザープールドメインの `/authorize` エンドポイントの URL を入力します。ユーザーが接続アプリケーションにアクセスすると、Salesforce はこの URL に誘導してサインインを完了します。次に、Salesforce はユーザーをアプリクライアントに関連付けたコールバック URL にリダイレクトします。

      ```
      https://mydomain.auth.us-east-1.amazoncognito.com/authorize?response_type=code&client_id=<your_client_id>&redirect_uri=https://www.example.com&identity_provider=CorpSalesforce
      ```

   1. **OAuth 設定**を有効にし、**コールバック URL** にユーザープールドメインの `/oauth2/idpresponse` エンドポイントの URL を入力します。これは、Amazon Cognito が OAuth トークンと交換する認可コードを Salesforce が発行する URL です。

      ```
      https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
      ```

1. [スコープ](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes)を選択します。スコープ **openid** を含める必要があります。**email** および **email\$1verified** の [クレーム](https://openid.net/specs/openid-connect-basic-1_0.html#StandardClaims)へのアクセスを許可するには、**email** スコープを追加します。スコープはスペースで区切ります。

1. **[作成]** を選択します。

   Salesforce では、クライアント ID は [**コンシューマーキー**]、クライアントシークレットは [**コンシューマーシークレット**] と呼ばれます。クライアント ID とクライアントシークレットを書き留めます。これらは次のセクションで使用します。

## ユーザープールに OIDC IdP を追加する
<a name="cognito-user-pools-oidc-idp-step-2"></a>

IdP を設定したら、OIDC IdP で認証リクエストを処理するようにユーザープールを設定できます。

------
#### [ Amazon Cognito console ]

**コンソールで OIDC IdP を追加する**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)に移動します。プロンプトが表示されたら、 AWS 認証情報を入力します。

1. ナビゲーションメニューから **[User Pools]** (ユーザープール) を選択します。

1. リストから既存のユーザープールを選択するか、[ユーザープールを作成](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)します。

1. **[ソーシャルプロバイダーと外部プロバイダー]** メニューを選択し、**[ID プロバイダーを追加]** を選択します。

1. [**OpenID Connect**] IdP を選択します。

1. **[プロバイダー名]** に一意の名前を入力します。

1. IdP の **[クライアント ID]** を入力します。これは、OIDC IdP で構築するアプリケーションクライアントの ID です。指定するクライアント ID は、`https://[your user pool domain]/oauth2/idpresponse` のコールバック URL で設定した OIDC プロバイダーである必要があります。

1. IdP の **[クライアントシークレット]** を入力します。これは、前のステップで入力したのと同じアプリケーションクライアントのクライアントシークレットである必要があります。

1. <a name="cognito-user-pools-oidc-step-2-substep-9"></a>このプロバイダーの **[Authorized scopes]** (承認済みスコープ) を入力します。スコープは、アプリケーションがプロバイダーにリクエストするユーザー属性のグループ (`name` および `email` など) を定義します。[OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-3.3) 仕様に従い、スコープはスペースで区切る必要があります。

   IdP は、ユーザーがサインインするときに、これらの属性をアプリケーションに提供することに同意するようユーザーに求める場合があります。

1. **[属性のリクエストメソッド]** を選択します。IdP は、`userInfo` エンドポイントへのリクエストを `GET` または `POST` の形式にするよう求める場合があります。例えば、Amazon Cognito の `userInfo` エンドポイントには `HTTP GET` リクエストが必要です。

1. **[セットアップ方法]** で、IdP の主要な OIDC フェデレーションエンドポイントへのパスを、ユーザープールで決定する方法を選択します。通常、IdP は、発行者のベース URL で `/well-known/openid-configuration` エンドポイントをホストします。これが該当するプロバイダーの場合、**[発行者 URL を通じた自動入力]** オプションは、そのベース URL の入力を求め、そこから `/well-known/openid-configuration` パスへのアクセスを試み、表示されたエンドポイントを読み取ります。エンドポイントパスが通常とは異なっていたり、代替プロキシを介して 1 つ以上のエンドポイントにリクエストを渡したりする場合があります。その場合は、**[手動入力]** を選択し、`authorization`、`token`、`userInfo`、`jwks_uri` エンドポイントのパスを指定します。
**注記**  
URL は、`https://` で始める必要があり、末尾にスラッシュ (`/`) を使用することはできません。この URL では、ポート番号 443 および 80 のみを使用できます。例えば、Salesforce では次の URL を使用します。  
`https://login.salesforce.com`   
自動入力を選択した場合、検出ドキュメントは `authorization_endpoint`、`token_endpoint`、`userinfo_endpoint`、および `jwks_uri` の値に HTTPS を使用する必要があります。そうしない場合は、ログインが失敗します。

1. **[OpenID Connect プロバイダーとユーザープール間の属性をマッピングする]** で属性マッピングルールを設定します。**ユーザープール属性**は Amazon Cognito ユーザープロファイルの*送信先*属性であり、**OpenID Connect 属性**は ID トークンのクレームまたは `userInfo` レスポンスで Amazon Cognito が検索する*ソース*属性です。Amazon Cognito は、OIDC クレーム **sub** を送信先ユーザープロファイルの `username` に自動的にマッピングします。

   詳細については、「[IdP 属性をプロファイルとトークンにマッピングする](cognito-user-pools-specifying-attribute-mapping.md)」を参照してください。

1. **[ID プロバイダーを追加]** を選択します。

1. **[アプリケーションクライアント]** メニューで、リストからアプリケーションクライアントを選択します。**[ログインページ]** タブに移動し、**[マネージドログインページの設定]** で **[編集]** を選択します。**[ID プロバイダー]** を見つけ、新しい OIDC IdP を追加します。

1. **[Save changes]** (変更の保存) をクリックします。

------
#### [ API/CLI ]

[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html#API_CreateIdentityProvider_Example_2) の例 2 の OIDC 設定を参照してください。この構文を変更して、`CreateIdentityProvider` と `UpdateIdentityProvider` のリクエスト本文として使用するか、[create-identity-provider](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-identity-provider.html) の `--cli-input-json` 入力ファイルとして使用できます。

------

## OIDC IdP の設定をテストする
<a name="cognito-user-pools-oidc-idp-step-3"></a>

アプリケーションでは、ユーザーが OIDC プロバイダーでサインインできるように、ユーザーのクライアントでブラウザを起動する必要があります。前のセクションのセットアップ手順を完了したら、プロバイダーを使用したサインインをテストします。次の URL の例では、プレフィックスドメインを持つユーザープールのサインインページをロードします。

```
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com
```

このリンクは、**[アプリケーションクライアント]** メニューに移動してアプリケーションクライアントを選択し、**[ログインページ]** タブに移動して **[ログインページを表示]** を選択したときに、Amazon Cognito に表示されるページです。ユーザープールドメインの詳細については、「[ユーザープールのドメインを設定する](cognito-user-pools-assign-domain.md)」を参照してください。クライアント ID とコールバック URL など、アプリケーションクライアントの詳細については、「[アプリケーションクライアントによるアプリケーション固有の設定](user-pool-settings-client-apps.md)」を参照してください。

次のリンク例では、`identity_provider` クエリパラメータを使用して、[認可エンドポイント](authorization-endpoint.md) から `MyOIDCIdP` プロバイダーへのサイレントリダイレクトを設定します。この URL は、マネージドログインによるインタラクティブなユーザープールのサインインをバイパスし、IdP サインインページに直接移動します。

```
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?identity_provider=MyOIDCIdP&response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com
```

# OIDC ユーザープール IdP 認証フロー
<a name="cognito-user-pools-oidc-flow"></a>

OpenID Connect (OIDC) サインインを使用すると、ユーザープールは ID プロバイダー (IdP) による認可コードサインインフローを自動化します。ユーザーが IdP でサインインを完了すると、Amazon Cognito は外部プロバイダーの `oauth2/idpresponse` エンドポイントでコードを収集します。結果として得られたアクセストークンを使用して、ユーザープールは、IdP `userInfo` エンドポイントにクエリを実行してユーザー属性を取得します。その後、ユーザープールは、受信した属性を、設定済みの属性マッピングルールと比較し、それに応じてユーザーのプロファイルと ID トークンを入力します。

OIDC プロバイダー設定でリクエストする OAuth 2.0 スコープは、IdP が Amazon Cognito に提供するユーザー属性を定義します。セキュリティのベストプラクティスとしては、ユーザープールにマッピングする属性に対応するスコープのみをリクエストします。例えば、ユーザープールが `openid profile` をリクエストすると、考えられる属性がすべて取得されますが、`openid email phone_number` をリクエストすると、ユーザーの E メールアドレスと電話番号のみが取得されます。[OIDC IdP にリクエスト](cognito-user-pools-oidc-idp.md#cognito-user-pools-oidc-step-2-substep-9)するスコープについては、[アプリケーションクライアント](user-pool-settings-client-apps.md#user-pool-settings-client-apps-scopes)とユーザープール認証リクエストで認可とリクエストを行うスコープとは異なるものとして設定できます。

ユーザーが OIDC IdP を使用してアプリケーションにサインインする場合、ユーザープールは、以下の認証フローはを実行します。

1. ユーザーはマネージドログインのサインインページにアクセスし、OIDC IdP でサインインすることを選択します。

1. アプリケーションは、ユーザーのブラウザを、ユーザープールの承認エンドポイントに誘導します。

1. ユーザープールは、OIDC IdP の承認エンドポイントにリクエストをリダイレクトします。

1. IdP にログインプロンプトが表示されます。

1. アプリケーションでは、ユーザーのセッションに OIDC IdP のサインインプロンプトが表示されます。

1. ユーザーは IdP の認証情報を入力するか、認証済みセッションの Cookie を提示します。

1. ユーザーが認証を行うと、OIDC IdP が認可コードを使用して Amazon Cognito にリダイレクトします。

1. ユーザープールは、認証コードを ID トークンおよびアクセストークンと交換します。IdP にスコープ `openid` を設定すると、Amazon Cognito はアクセストークンを受け取ります。ID トークンのクレームと `userInfo` レスポンスは、IdP 設定のその他のスコープ (`profile` や `email` など) によって決まります。

1. IdP はリクエストされたトークンを発行します。

1. ユーザープールは、IdP 設定の発行者 URL から IdP の `jwks_uri` エンドポイントへのパスを決定し、JSON ウェブキーセット (JWKS) エンドポイントに対してトークン署名キーをリクエストします。

1. IdP は JWKS エンドポイントから署名キーを返します。

1. ユーザープールは、トークン内の署名と有効期限のデータから IdP トークンを検証します。

1. ユーザープールは、アクセストークンを使用して IdP の `userInfo` エンドポイントへのリクエストを承認します。IdP は、アクセストークンのスコープに基づいて、ユーザーデータを返します。

1. ユーザープールは、IdP からの ID トークンと `userInfo` レスポンスを、ユーザープール内の属性マッピングルールと比較します。マッピングされた IdP 属性をユーザープールのプロファイル属性に書き込みます。

1. Amazon Cognito がアプリケーションのベアラートークンを発行します。これには ID トークン、アクセストークン、および更新トークンが含まれる場合があります。

1. アプリケーションは、ユーザープールのトークンを処理し、ユーザーをサインインさせます。

![\[OIDC ユーザープール IdP 認証フロー\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/flow-cup-oidc-endpoints.png)


**注記**  
Amazon Cognito は 5 分以内に完了しない認証リクエストをキャンセルし、ユーザーをマネージドログインにリダイレクトします。ページには、`Something went wrong` というエラーメッセージが表示されます。

OIDC は、OAuth 2.0 の上に位置する ID レイヤーです。OAuth 2.0 は、IdP から OIDC クライアントアプリ (証明書利用者) に発行される JSON 形式 (JWT) の ID トークンを指定します。Amazon Cognito の OIDC Relying Party としての追加に関する情報は、OIDC IdP のドキュメントを参照してください。

ユーザーが認可コード付与を使用して認証すると、ユーザープールは ID、アクセス、更新トークンを返します。ID トークンは ID 管理用の [OIDC](http://openid.net/specs/openid-connect-core-1_0.html) 標準トークンです。アクセストークンは [OAuth 2.0](https://oauth.net/2/) 標準トークンです。ユーザープールのアプリケーションクライアントがサポートできる付与タイプの詳細については、「[認可エンドポイント](authorization-endpoint.md)」を参照してください。

## ユーザープールが OIDC プロバイダーからのクレームを処理する方法
<a name="how-a-cognito-user-pool-processes-claims-from-an-oidc-provider"></a>

ユーザーがサードパーティの OIDC プロバイダーでサインインを完了すると、マネージドログインは IdP から認証コードを取得します。ユーザープールは、アクセストークンと ID トークンの認可コードを IdP の `token` エンドポイントと交換します。ユーザープールはこれらのトークンをユーザーやアプリに渡すのではなく、これらを使って独自のトークンのクレームで提示するデータを使用してユーザープロファイルを構築します。

 Amazon Cognito はアクセストークンを個別に検証しません。代わりに、`userInfo`プロバイダーの エンドポイントにユーザー属性情報をリクエストし、トークンが有効でない場合はリクエストが拒否されることを想定しています。

Amazon Cognito は、以下のチェックを行ってプロバイダー ID トークンを検証します。

1. プロバイダーが RSA、HMAC、Elliptic Curve というセットのアルゴリズムを使用してトークンに署名したことをチェックします。

1. プロバイダーが非対称署名アルゴリズムを使用してトークンに署名した場合は、トークンの `kid` クレームの署名キー ID がプロバイダーの `jwks_uri` エンドポイントに表示されていることを確認します。Amazon Cognito は、処理する IdP ID トークンごとに、IdP 設定の JWKS エンドポイントから署名キーを更新します。

1. ID トークンの署名を、プロバイダーのメタデータに基づいて想定される署名と比較します。

1. `iss` クレームを IdP に設定された OIDC 発行者と比較します。

1. `aud` クレームが IdP で設定されているクライアント ID と一致するか、または `aud` クレームに複数の値がある場合は設定されたクライアント ID が含まれているかを比較します。

1. `exp` クレームのタイムスタンプが現在の時刻より前でないことをチェックします。

ユーザープールは ID トークンを検証し、プロバイダーアクセストークンを使用してプロバイダーの `userInfo` エンドポイントへのリクエストを試みます。アクセストークンのスコープによって読み取りが許可されたユーザープロファイル情報がすべて取得されます。次にユーザープールはユーザープールの要求に従って設定したユーザー属性を検索します。プロバイダー設定で、必要な属性の属性マッピングを作成する必要があります。ユーザープールはプロバイダー ID トークンと `userInfo` レスポンスをチェックします。ユーザープールは、マッピングルールに一致するすべてのクレームをユーザープールのユーザープロファイルのユーザー属性に書き込みます。ユーザープールは、マッピングルールに一致するが必須ではなく、プロバイダーのクレームにも含まれていない属性を無視します。