

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

# サードパーティーの ID プロバイダーを使用したユーザープールへのサインイン
<a name="cognito-user-pools-identity-federation"></a>

アプリケーションユーザーは、ユーザープール経由で直接サインインするか、またはサードパーティーの ID プロバイダー (IdP) 経由でフェデレーション方式で認証を行うことができます。ユーザープールは、Facebook、Google、Amazon、Apple 経由のソーシャルサインイン、および OpenID Connect (OIDC) と SAML IdP から返されるトークンの処理のオーバーヘッドを管理します。組み込みの Hosted Web UI では、Amazon Cognito がすべての認証済みユーザーに関するトークンの処理と管理を提供します。このように、バックエンドシステムは 1 セットのユーザープールトークンで標準化できます。

## Amazon Cognito ユーザープールでのフェデレーションサインインの仕組み
<a name="cognito-user-pools-identity-federation-how-it-works"></a>

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

![\[ソーシャルサインインの認証の概要\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-authentication-cup.png)


Amazon Cognito はユーザーディレクトリであり、OAuth 2.0 ID プロバイダー (IdP) です。Amazon Cognito ディレクトリに*ローカルユーザー*をサインインさせると、ユーザープールがアプリの IdP になります。ローカルユーザーは、外部 IdP を介したフェデレーションなしに、ユーザープールディレクトリにのみ存在します。

Amazon Cognito をソーシャル、SAML、または OpenID Connect (OIDC) IdP に接続すると、ユーザープールは複数のサービスプロバイダーとアプリ間のブリッジとして機能します。IdP にとって、Amazon Cognito はサービスプロバイダー (SP) です。IdP は、OIDC ID トークンまたは SAML アサーションを Amazon Cognito に渡します。Amazon Cognito は、トークンまたはアサーション内のユーザーに関するクレームを読み取り、それらのクレームをユーザープールディレクトリ内の新しいユーザープロファイルにマッピングします。

Amazon Cognito は、フェデレーションユーザーのユーザープロファイルを独自のディレクトリに作成します。Amazon Cognito は、IdP からのクレームと、OIDC およびソーシャル ID プロバイダーの場合は、IdP によるパブリック `userinfo` エンドポイントに基づいて、ユーザーに属性を追加します。マッピングされた IdP 属性が変更されると、ユーザーの属性はユーザープール内で変化します。さらに、IdP の属性から独立した属性を追加することもできます。

Amazon Cognito がフェデレーションユーザーのプロファイルを作成すると、その機能が変更され、SP となったアプリに IdP として表示されます。Amazon Cognito は OIDC と OAuth 2.0 IdP の組み合わせです。アクセストークン、ID トークン、およびリフレッシュトークンを生成します。トークンの詳細については、[ユーザープール JSON ウェブトークン (JWT) の理解](amazon-cognito-user-pools-using-tokens-with-identity-providers.md) を参照してください。

フェデレーションまたはローカルを問わず、ユーザーを認証して認可するために、Amazon Cognito と統合するアプリを設計する必要があります。

## Amazon Cognito のサービスプロバイダーとしてのアプリの責任
<a name="cognito-user-pools-identity-federation-how-it-works-app-responsibilities"></a><a name="cognito-user-pools-identity-federation-how-it-works-app-responsibilities"></a>

**トークンの情報を検証して処理する**  
ほとんどのシナリオでは、Amazon Cognito は認証されたユーザーを、認可コードを追加したアプリの URL にリダイレクトします。アプリは、アクセス、ID、およびリフレッシュの各トークンと[このコードを交換](https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html)します。そして、[トークンの有効性を確認](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html)し、トークン内のクレームに基づいて、ユーザーに情報を提供する必要があります。

**Amazon Cognito API リクエストによる認証イベントへの応答**  
アプリは、[Amazon Cognito ユーザープール API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html) と[認証 API エンドポイント](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)と統合する必要があります。認証 API は、ユーザーのサインインとサインアウトを行い、トークンを管理します。ユーザープール API には、ユーザープール、ユーザー、および認証環境のセキュリティを管理するさまざまなオペレーションがあります。アプリは。Amazon Cognito からの応答を受信したときに次に何をすべきかを知っている必要があります。

## Amazon Cognito ユーザープールサードパーティーサインインについて知っておくべきこと
<a name="cognito-user-pools-identity-federation-how-it-works-considerations"></a><a name="cognito-user-pools-identity-federation-how-it-works-considerations"></a>
+ フェデレーションプロバイダーでユーザーにサインインさせたい場合は、ドメインを選択する必要があります。これにより、[マネージドログイン](cognito-userpools-server-contract-reference.md)用のページが設定されます。詳細については、「[マネージドログインに独自のドメインを使用する](cognito-user-pools-add-custom-domain.md)」を参照してください。
+ [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) や [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) のような API オペレーションを使用してフェデレーションユーザーでサインインすることはできません。フェデレーションユーザーは、[ログインエンドポイント](login-endpoint.md) または [認可エンドポイント](authorization-endpoint.md) でのみサインインできます。
+ [認可エンドポイント](authorization-endpoint.md) はリダイレクションエンドポイントです。リクエストに `idp_identifier` パラメータまたは `identity_provider` パラメータを指定すると、マネージドログインをバイパスして、IdP にサイレントにリダイレクトされます。それ以外の場合は、マネージドログインの[ログインエンドポイント](login-endpoint.md)にリダイレクトされます。
+ マネージドログインがセッションをフェデレーティッド IdP にリダイレクトすると、Amazon Cognito は、`Amazon/Cognito` リクエストに `user-agent` ヘッダーを含めます。
+ Amazon Cognito は、フェデレーションユーザープロファイルの `username` 属性を、固定識別子と IdP の名前の組み合わせから派生します。カスタム要件に一致するユーザー名を生成するには、`preferred_username` 属性へのマッピングを作成します。詳細については、「[マッピングについて知っておくべきこと](cognito-user-pools-specifying-attribute-mapping.md#cognito-user-pools-specifying-attribute-mapping-requirements)」を参照してください。

  例: `MyIDP_bob@example.com`
+ Amazon Cognito は、ユーザープールに追加する OIDC、SAMl、ソーシャル IdP ごとに[ユーザーグループ](cognito-user-pools-user-groups.md)を作成します。グループ名の形式は `[user pool ID]_[IdP name]` です (例: `us-east-1_EXAMPLE_MYSSO`、`us-east-1_EXAMPLE_Google`)。自動生成された一意の各 IdP ユーザープロファイルは、このグループに自動的に追加されます。[リンクされたユーザー](cognito-user-pools-identity-federation-consolidate-users.md)は、このグループに自動的に追加されませんが、そのプロファイルを別のプロセスでグループに追加できます。
+ Amazon Cognito は、フェデレーションユーザーの ID に関する情報を属性および `identities` と呼ばれる ID トークン内のクレームに記録します。このクレームには、ユーザーのプロバイダーと、プロバイダーからの一意の ID が含まれます。ユーザープロファイル内の `identities` 属性を直接変更することはできません。フェデレーションユーザーをリンクする方法の詳細については、「[フェデレーションユーザーを既存のユーザープロファイルにリンクする](cognito-user-pools-identity-federation-consolidate-users.md)」を参照してください。
+ [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API リクエストで IdP を更新する場合、変更がマネージドログインに反映されるまでに最大で 1 分かかることがあります。
+ Amazon Cognito は、自身と IdP との間で最大 20 の HTTP リダイレクトをサポートします。
+ ユーザーがマネージドログインを使用してサインインすると、ブラウザは、暗号化されたログインセッション Cookie を保存することで、サインインに使用したクライアントとプロバイダーを記録します。ユーザーが同じパラメータを使用して再度サインインしようとすると、マネージドログインは*有効期限が切れていない*既存のセッションをすべて再利用するため、ユーザーは認証情報を再入力することなく認証されます。ローカルユーザープールログインへの切り替えやローカルユーザープールログインからの切り替えなど、ユーザーが別の IdP で再度ログインする場合は、認証情報を入力して新しいログインセッションを生成する必要があります。

  ユーザープール IdPs は任意のアプリクライアントに割り当てることができ、ユーザーはアプリクライアントに割り当てた IdP でのみサインインできます。

**Topics**
+ [Amazon Cognito ユーザープールでのフェデレーションサインインの仕組み](#cognito-user-pools-identity-federation-how-it-works)
+ [Amazon Cognito のサービスプロバイダーとしてのアプリの責任](#cognito-user-pools-identity-federation-how-it-works-app-responsibilities)
+ [Amazon Cognito ユーザープールサードパーティーサインインについて知っておくべきこと](#cognito-user-pools-identity-federation-how-it-works-considerations)
+ [ユーザープールの ID プロバイダーの設定](cognito-user-pools-identity-provider.md)
+ [ユーザープールによるソーシャル ID プロバイダーの使用](cognito-user-pools-social-idp.md)
+ [ユーザープールによる SAML ID プロバイダーの使用](cognito-user-pools-saml-idp.md)
+ [ユーザープールでの OIDC ID プロバイダーの使用](cognito-user-pools-oidc-idp.md)
+ [IdP 属性をプロファイルとトークンにマッピングする](cognito-user-pools-specifying-attribute-mapping.md)
+ [フェデレーションユーザーを既存のユーザープロファイルにリンクする](cognito-user-pools-identity-federation-consolidate-users.md)

# ユーザープールの ID プロバイダーの設定
<a name="cognito-user-pools-identity-provider"></a>

ユーザープールを使用すると、さまざまな外部 ID プロバイダー (IdP) を通じてサインインを実装できます。ガイドのこのセクションには、Amazon Cognito コンソールでユーザープールを使用してこれらの ID プロバイダーを設定する手順が記載されています。または、ユーザープール API と AWS SDK を使用して、ユーザープール ID プロバイダーをプログラムで追加することもできます。詳細については、「[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html)」を参照してください。

サポートされている ID プロバイダーのオプションには、Facebook、Google、Amazon などのソーシャルプロバイダー、OpenID Connect (OIDC)、SAML 2.0 プロバイダーなどがあります。開始する前に、IdP の管理認証情報を設定します。プロバイダーのタイプごとに、アプリケーションの登録、必要な認証情報の取得、ユーザープールでのプロバイダーの詳細の設定を行う必要があります。その後、ユーザーは、接続された ID プロバイダーの既存アカウントを使用して、アプリケーションへのサインアップとサインインができます。

**[認証]** の下にある **[ソーシャルプロバイダーと外部プロバイダー]** メニューで、ユーザープールの IdP を追加および更新します。詳細については、「[サードパーティーの ID プロバイダーを使用したユーザープールへのサインイン](cognito-user-pools-identity-federation.md)」を参照してください。

**Topics**
+ [ソーシャル IdP でユーザーサインインを設定する](#cognito-user-pools-facebook-provider)
+ [OIDC IdP でユーザーサインインを設定する](#cognito-user-pools-oidc-providers)
+ [SAML IdP でユーザーサインインを設定する](#cognito-user-pools-saml-providers)

## ソーシャル IdP でユーザーサインインを設定する
<a name="cognito-user-pools-facebook-provider"></a>

フェデレーションを使用して、Amazon Cognito のユーザープールを Facebook、Google、Login with Amazon などのソーシャル ID プロバイダーと統合することができます。

ソーシャル ID プロバイダーを追加するには、最初に ID プロバイダーでデベロッパーアカウントを作成します。デベロッパーアカウントが作成されたら、アプリを ID プロバイダーに登録します。ID プロバイダーがアプリ用のアプリ ID とアプリシークレットを作成するので、これらの値を Amazon Cognito ユーザープールで設定します。
+ [Google Identity Platform](https://developers.google.com/identity/)
+ [Facebook for Developers](https://developers.facebook.com/docs/facebook-login)
+ [Login with Amazon](https://developer.amazon.com/login-with-amazon)
+ [Apple でサインイン](https://developer.apple.com/sign-in-with-apple/)

**ユーザーサインインとソーシャル IdP を統合するには**

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

1. ナビゲーションペインで **[User Pools]** (ユーザープール) を選択してから、編集するユーザープールを選択します。

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

1. **[Add an identity provider]** (ID プロバイダーを追加する) を選択、または、設定した **[Facebook]**、**[Google]**、**[Amazon]**、または **[Apple]** などを選択し、**[Identity provider information]** (ID プロバイダー情報) を検索し、**[Edit]** (編集) をクリックします。ソーシャル ID プロバイダーの追加の詳細については、「[ユーザープールによるソーシャル ID プロバイダーの使用](cognito-user-pools-social-idp.md)」を参照してください。

1. 選択した IdP に基づいて、次のいずれかの手順を実行して、ソーシャル ID プロバイダーの情報を入力します。  
**Facebook、Google、および Login with Amazon**  
クライアントアプリを作成したときに受け取ったアプリ ID とアプリシークレットを入力します。  
**Apple でサインイン**  
Apple に提供したサービス ID、およびアプリケーションクライアントを作成したときに受け取ったチーム ID、キー ID、プライベートキーを入力します。

1. **[Authorize scopes]** (承認スコープ) に、ユーザープール属性にマップするソーシャル ID プロバイダースコープの名前を入力します。スコープは、アプリケーションでアクセスするユーザー属性 (名前や E メールなど) を定義します。スコープを入力するときは、選択した IdP に基づいて、次のガイドラインに従ってください。
   + **Facebook** — スコープはカンマで区切ります。例:

     `public_profile, email`
   + **Google、Login with Amazon、Sign in with Apple** — スコープをスペースで区切ります。例:
     + **Google:** `profile email openid`
     + **Login with Amazon:** `profile postal_code`
     + **Sign In with Apple:** `name email`
**注記**  
Sign in with Apple (コンソール) の場合は、チェックボックスを使用してスコープを選択します。

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

1. **[アプリケーションクライアント]** メニューで、リストからアプリケーションクライアントを選択し、**[編集]** を選択します。**[Identity providers]** (ID プロバイダー) で、新しいソーシャル ID プロバイダーをアプリケーションクライアントに追加します。

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

ソーシャル IdP の詳細については、「[ユーザープールによるソーシャル ID プロバイダーの使用](cognito-user-pools-social-idp.md)」を参照してください。

## OIDC IdP でユーザーサインインを設定する
<a name="cognito-user-pools-oidc-providers"></a>

Salesforce や Ping Identity などの OpenID Connect (OIDC) ID プロバイダーとユーザーサインインを統合することができます。

**OIDC プロバイダーをユーザープールに追加するには**

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]** (OpenID 接続) ID プロバイダーを選択します。

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

1. プロバイダーから受け取ったクライアント ID を、**[Client ID]** (クライアント ID) へ入力します。

1. プロバイダーから受け取ったクライアントシークレットを、**[Client secret]** (クライアントシークレット) に入力します。

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

   ユーザーはこれらの属性をアプリケーションに提供することに同意する必要があります。

1. **[Attribute request method]** (属性リクエストメソッド) を選択して、プロバイダーが操作する **[userInfo]** エンドポイントからユーザーの詳細をフェッチするために必要な HTTP メソッド（GET または POST）を Amazon Cognito に提供します。

1. **[Setup method]** (セットアップ方法) を選択して、OpenID Connect エンドポイントを、**[Auto fill through issuer URL]** (発行者 URL による自動入力) または **[Manual input]** (手動入力) で取得します。**[発行者 URL を通じた自動入力]** は、プロバイダーにパブリック `.well-known/openid-configuration` エンドポイントがあり、これを通じて Amazon Cognito が `authorization`、`token`、`userInfo`、`jwks_uri` エンドポイントの URL を取得できる場合に使用します。

1. 発行者の URL、または IdP からの `authorization`、`token`、`userInfo`、および `jwks_uri` エンドポイントの URL を入力します。
**注記**  
検出、自動入力、および手動で入力された URL には、ポート番号 443 と 80 のみを使用できます。OIDC プロバイダーが標準外の TCP ポートを使用している場合、ユーザーログインは失敗します。  
発行者の URL は `https://` で始まる必要があり、`/` 文字で終わらせることはできません。例えば、Salesforce では次の URL を使用します。  
`https://login.salesforce.com`   
発行者 URL に関連付けられている `openid-configuration` ドキュメントには、次の値の HTTPS URL を指定する必要があります: `authorization_endpoint`、`token_endpoint`、`userinfo_endpoint`、および `jwks_uri`。同様に、**[Manual input]** (手動入力) を選択する場合は、HTTPS URL のみを入力できます。

1. デフォルトで、OIDC クレームの **[sub]** (サブ) はユーザープール属性の **[Username]** (ユーザーネーム) にマッピングされます。他の OIDC [クレーム](https://openid.net/specs/openid-connect-basic-1_0.html#StandardClaims)をユーザープール属性にマッピングできます。OIDC クレームを入力し、対応するユーザープール属性をドロップダウンリストから選択します。例えば、通常、クレームの [**email**] はユーザープール属性の [**E メール**] にマッピングされます。

1. ID プロバイダーからユーザープールに追加の属性をマッピングします。詳細は、「[ユーザープール用 ID プロバイダー属性マッピングの特定](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-specifying-attribute-mapping.html)」を参照してください。

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

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

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

OIDC IdPs の詳細については、「[ユーザープールでの OIDC ID プロバイダーの使用](cognito-user-pools-oidc-idp.md)」を参照してください。

## SAML IdP でユーザーサインインを設定する
<a name="cognito-user-pools-saml-providers"></a>

Amazon Cognito ユーザープールのフェデレーションを使用して、SAML ID プロバイダー (IdP) と統合することができます。メタデータドキュメントを指定します。ファイルをアップロードするか、メタデータドキュメントのエンドポイント URL を入力します。サードパーティーの SAML IdP のメタデータドキュメントの取得については、「[サードパーティー SAML ID プロバイダーの設定](cognito-user-pools-integrating-3rd-party-saml-providers.md)」を参照してください。

**ユーザープールに SAML 2.0 ID プロバイダーを設定する**

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. **[SAML]** ID プロバイダーを選択します。

1. カンマで区切られた **[Identifiers]** (識別子) を入力します。識別子は Amazon Cognito に、ユーザーのサインイン E メールアドレスを確認し、ドメインに対応するプロバイダーに誘導する必要があることを伝えます。

1. ユーザーがログアウトしたときに、Amazon Cognito が署名されたサインアウト要求をプロバイダーに送信するためには、**[Add sign-out flow]** (サインアウトフローの追加) を選択します。マネージドログインの設定時に Amazon Cognito で作成した `https://mydomain.auth.us-east-1.amazoncognito.com/saml2/logout` エンドポイントにサインアウトレスポンスを送信するように、SAML 2.0 ID プロバイダーを設定します。`saml2/logout` エンドポイントでは、ポストバインディングを使用します。
**注記**  
このオプションを選択し、SAML ID プロバイダーが署名付きログアウトリクエストを期待する場合は、SAML IdP で Amazon Cognito が提供する署名証明書を設定する必要もあります。  
SAML IdP は署名されたログアウトリクエストを処理し、Amazon Cognito セッションからユーザーをログアウトさせます。

1. **[Metadata document source]** (メタデータドキュメントソース) を選択します。ID プロバイダーがパブリック URL で SAML メタデータを提供する場合は、**[Metadata document URL]** (メタデータドキュメント URL) を選択してそのパブリック URL を入力できます。それ以外の場合は、**[Upload metadata document]** (メタデータドキュメントをアップロード) を選択し、プロバイダーから以前ダウンロードしたメタデータファイルを選択します。
**注記**  
プロバイダーにパブリックエンドポイントがある場合は、ファイルをアップロードするのではなく、メタデータドキュメントの URL を入力することをお勧めします。URL を使用する場合、Amazon Cognito はメタデータを自動的に更新します。通常、メタデータの更新は 6 時間ごとまたはメタデータの有効期限が切れる前のいずれか早いタイミングで発生します。

1. **[Map attributes between your SAML provider and your app]** (SAML プロバイダーとアプリ間で属性をマッピング) をクリックして、SAML プロバイダーの属性をユーザープールのユーザープロファイルにマッピングします。ユーザープールの必須属性を属性マップに含めます。

   たとえば、**[User pool attribute]** (ユーザープール属性) `email` を選択する場合、ID プロバイダーからの SAML アサーションに表示される SAML 属性名を入力します。ID プロバイダーは、参考として SAML アサーションのサンプルを提供する場合があります。ID プロバイダーの中には、`email` などの単純な名前を使用するものもあれば、次のような URL 形式の属性名を使用するものもあります。

   ```
   http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
   ```

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

**注記**  
HTTPS メタデータエンドポイント URL を使用して SAML IdP を作成中に `InvalidParameterException` が表示される場合、メタデータエンドポイントの SSL が正しくセットアップされていること、および有効な SSL 証明書が関連付けられていることを確認してください。このような例外の例として、「Error retrieving metadata from *<metadata endpoint>*」が挙げられます。

**署名証明書を追加するために SAML IdP をセットアップする**
+ IdP が署名付きログアウトリクエストの検証に使用するパブリックキーを含む証明書を取得するには、次の手順を実行します。

  1. ユーザープールの **[ソーシャルプロバイダーと外部プロバイダー]** メニューに移動します。

  1. SAML プロバイダーを選択します。

  1. **[署名証明書を表示]** を選択します。

SAML IdP の詳細については、「[ユーザープールによる SAML ID プロバイダーの使用](cognito-user-pools-saml-idp.md)」を参照してください。

# ユーザープールによるソーシャル ID プロバイダーの使用
<a name="cognito-user-pools-social-idp"></a>

ウェブおよびモバイルアプリのユーザーは、Facebook、Google、Amazon、Apple などのソーシャル ID プロバイダー (IdP) 経由でサインインできます。組み込みの Hosted Web UI では、Amazon Cognito がすべての認証済みユーザーに関するトークンの処理と管理を提供します。このように、バックエンドシステムは 1 セットのユーザープールトークンで標準化できます。サポートされているソーシャル ID プロバイダーと統合するには、マネージドログインを有効にする必要があります。Amazon Cognito は、マネージドログインページの構築時に OAuth 2.0 エンドポイントを作成します。Amazon Cognito、OIDC IdP、ソーシャル IdP は、このエンドポイントを使用して情報を交換します。詳細については、[Amazon Cognito API リファレンス](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)を参照してください。

ソーシャル IdP を に追加するか AWS マネジメントコンソール、CLI または Amazon Cognito API AWS を使用できます。

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

**Topics**
+ [ソーシャル IdP デベロッパーのアカウントとアプリケーションを設定する](#cognito-user-pools-social-idp-step-1)
+ [ソーシャル IdP を使用してユーザープールを設定する](#cognito-user-pools-social-idp-step-2)
+ [ソーシャル IdP の設定をテストする](#cognito-user-pools-social-idp-step-3)

## ソーシャル IdP デベロッパーのアカウントとアプリケーションを設定する
<a name="cognito-user-pools-social-idp-step-1"></a>

Amazon Cognito でソーシャル IdP を作成する前に、アプリケーションをソーシャル IdP に登録して、クライアント ID とクライアントシークレットを取得する必要があります。

------
#### [ Facebook ]

Meta デベロッパーのアカウントと認証の設定に関する最新情報については、「[Meta でのアプリ開発](https://developers.facebook.com/docs/development)」を参照してください。

**アプリケーションを Facebook/Meta に登録する方法**

1. [Facebook の開発者アカウント](https://developers.facebook.com/docs/facebook-login)を作成します。

1. Facebook 認証情報を使用して[サインイン](https://developers.facebook.com/)します。

1. **[My Apps]** (マイアプリ) メニューから、**[新しいアプリを作成]** (新しいアプリを作成) を選択します。

1. Facebook アプリケーションの名前を入力し、**[Create App ID]** (アプリケーション ID の作成) を選択します。

1. 左のナビゲーションバーで、[**設定**]、[**ベーシック**] の順に選択します。

1. **[App ID]** (アプリ ID)] と **[App Secret** (アプリシークレット) を書き留めます。これらは次のセクションで使用します。

1. ページの下部で、[**\$1 プラットフォームを追加**] を選択します。

1. **[Website]** (ウェブサイト) を選択します。

1. **[Website]** (ウェブサイト) で、アプリケーションのサインインページへのパスを **[Site URL]** (サイト URL) に入力します。

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

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

1. ユーザープールドメインのルートへのパスを **[App Domains]** (アプリケーションドメイン) に入力します。

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

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

1. ナビゲーションバーで **[Add Product]** (プロダクトの追加) を選択し、**[Facebook Login]** (Facebook ログイン) の **[Set up]** (設定) を選択します。

1. ナビゲーションバーで [**Facebook ログイン**]、[**設定**] の順に選択します。

   ユーザープールドメインの `/oauth2/idpresponse` エンドポイントへのパスを **[Valid OAuth Redirect URIs]** (有効な OAuth リダイレクト URI) に入力します。

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

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

------
#### [ Login with Amazon ]

Login with Amazon デベロッパーのアカウントと認証の設定に関する最新情報については、[「Login with Amazon に関するドキュメント](https://developer.amazon.com/docs/login-with-amazon/documentation-overview.html)」を参照してください。

**アプリケーションを Login with Amazon に登録する方法**

1. [Amazon の開発者アカウント](https://developer.amazon.com/login-with-amazon)を作成します。

1. Amazon 認証情報を使用して[サインイン](https://developer.amazon.com/lwa/sp/overview.html)します。

1. Amazon クライアント ID およびクライアントシークレットを受け取るには、Amazon セキュリティプロファイルを作成する必要があります。

   ページの上部にあるナビゲーションバーで [**Apps and Services (アプリとサービス)**] を選択し、[**Login with Amazon**] を選択します。

1. [**Create a New Security Profile (新しいセキュリティプロファイルの作成)**] を選択します。

1. **[Security Profile Name]** (セキュリティプロファイル名)、**[Security Profile Description]** (セキュリティプロファイルの説明)、**[Consent Privacy Notice URL]** (プライバシー規約 URL の同意) に入力します。

1. **[保存]** を選択します。

1. [**クライアント ID**] および [**クライアントシークレット**] を選択して、クライアント ID およびシークレットを表示します。これらは次のセクションで使用します。

1. 歯車アイコンにマウスカーソルを合わせ、**[Web Settings]** (ウェブ設定)、**[Edit]** (編集) の順に選択します。

1. **[Allowed Origins]** (許可されたオリジン) にユーザープールのドメインを入力します。

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

1. `/oauth2/idpresponse` エンドポイントを使用するユーザープールドメインを [**Allowed Return URLs**] (許可されたリターン URL) に入力します。

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

1. **[保存]** を選択します。

------
#### [ Google ]

Google Cloud プラットフォームの OAuth 2.0 の詳細については、「Google Workspace デベロッパーガイド」ドキュメントの「[認証と認可の詳細](https://developers.google.com/workspace/guides/auth-overview)」を参照してください。

**アプリケーションを Google に登録する方法**

1. [Google の開発者アカウント](https://developers.google.com/identity)を作成します。

1. [Google Cloud Platform コンソール](https://console.cloud.google.com/home/dashboard)にサインインします。

1. 上部のナビゲーションバーから、**[Select a project]** (プロジェクトの選択) を選択します。Google プラットフォームにプロジェクトが既にある場合は、このメニューには代わりにデフォルトのプロジェクトが表示されます。

1. **[NEW PROJECT]** (新しいプロジェクト) を選択します。

1. 製品の名前を入力し、**[CREATE]** (作成) を選択します。

1. 左のナビゲーションバーで、**[APIs and Services]** (API とサービス) を選択し、**[Oauth consent screen]** (OAuth 同意画面) を選択します。

1. アプリ情報、**[App domain]** (アプリドメイン)、**[Authorized domains]** (承認済みドメイン)、**[Developer contact information]** (開発者の連絡先情報) を入力します。**[Authorized domains]** (承認済みドメイン) には、`amazoncognito.com` とカスタムドメインのルート (例: `example.com`) を含める必要があります。**[SAVE AND CONTINUE]** (保存して続行) を選択します。

1. 1. **[Scopes]** (スコープ) で、**[Add or remove scopes]** (スコープの追加または削除) を選択し、少なくとも、次の OAuth スコープを選択します。

   1. `.../auth/userinfo.email`

   1. `.../auth/userinfo.profile`

   1. openid

1. **[Test users]** (テストユーザー) で、**[Add users]** (ユーザーの追加) を選択します。E メールアドレスおよびその他の承認済みテストユーザーを入力して、**[SAVE AND CONTINUE]** (保存して続行) を選択します。

1. 左のナビゲーションバーを再度展開し、**[APIs and Services]** (API とサービス) を選択して、**[Credentials]** (認証情報) を選択します。

1. **[CREATE CREDENTIALS]** (認証情報の作成)、**[OAuth client ID]** (OAuth クライアント ID) の順に選択します。

1. **[Application type]** (アプリケーションタイプ) を選択し、クライアントに **[Name]** (名前) を入力します。

1. **[Authorized JavaScript origins]** (承認済みの JavaScript 生成元) で、**[ADD URI]** (URI の追加) を選択します。ユーザープールのドメインを入力します。

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

1. **[Authorized redirect URIs]** (承認済みのリダイレクト URI) で、**[ADD URI]** (URI の追加) を選択します。ユーザープールのドメインの `/oauth2/idpresponse` エンドポイントへのパスを入力します。

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

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

1. **[Your client ID]** (クライアント ID) と **[Your client secret]** (クライアントシークレット) の下に Google が表示する値を安全に保存します。Google IdP を追加するときに、Amazon Cognito にこれらの値を指定します。

------
#### [ Sign in with Apple ]

「Apple でサインイン」の設定に関する最新の情報については、Apple デベロッパー向けドキュメントの「[Apple でサインインの環境を設定する](https://developer.apple.com/documentation/signinwithapple/configuring-your-environment-for-sign-in-with-apple)」を参照してください。

**アプリケーションを Apple でサインイン (SIWA) に登録する方法**

1. [Apple の開発者アカウント](https://developer.apple.com/programs/enroll/)を作成します。

1. Apple 認証情報を使用して[サインイン](https://developer.apple.com/account/#/welcome)します。

1. 左のナビゲーションバーで、**[Certificates, Identifiers & Profiles]** (証明書、ID & プロファイル) を選択します。

1. 左のナビゲーションペインで、**[Identifiers]** (識別子) を選択します。

1. **[Identifiers]** (識別子) ページで、**[\$1]** アイコンを選択します。

1. **[Register a New Identifier]** (新しい識別子の登録) ページで、**[App IDs]** (アプリ ID)、**[Continue]** (続行) の順に選択します。

1. **[Select a type]** (種類の選択) ページで、**[App]** (アプリ) を選択し、**[Continue]** (続行) を選択します。

1. [**Register an App ID**] ページで、次の操作を行います。

   1. **[Description]** (説明) で、説明を入力します。

   1. **[App ID Prefix]** (アプリ ID プレフィックス) に、**[Bundle ID]** (バンドル ID) を入力します。**[App ID Prefix]** (アプリケーション ID プレフィックス) にある値を書き留めておきます。この値は、[ソーシャル IdP を使用してユーザープールを設定する](#cognito-user-pools-social-idp-step-2) で Apple を ID プロバイダーとして選択した後で使用します。

   1. **[Capabilities] ** (機能) で、**[Sign In with Apple]** (Apple でサインイン) を選択してから **[Edit]** (編集) を選択します。

   1. **[Sign in with Apple: App ID Configuration]** (Apple でサインイン: アプリ ID の設定) ページで、アプリをプライマリとして設定するか、他のアプリ ID とグループ化するかを選択し、次に **[Save]** (保存) を選択します。

   1. [**続行**] をクリックしてください。

1. [**Confirm your App ID**] ページで、[**登録**] を選択します。

1. **[Identifiers]** (識別子) ページで、**[\$1]** アイコンを選択します。

1. **[Register a New Identifier]** (新しい識別子の登録) ページで、**[Services IDs]** (サービス ID)、**[Continue]** (続行) の順に選択します。

1. [**Register a Services ID**] ページで、次の操作を行います。

   1. [**説明**] に、説明を入力します。

   1. [**Identifier**] に、識別子を入力します。このサービス ID をメモしておきます。この値は、[ソーシャル IdP を使用してユーザープールを設定する](#cognito-user-pools-social-idp-step-2) で Apple を ID プロバイダーとして選択した後で必要になります。

   1. **[Continue]** (続行) を選択し、**[Register]** (登録) を選択します。

1. [Identifiers] (識別子) ページから、先ほど作成した [Services ID] (サービス ID) を選択します。

   1. **[Sign In with Apple]** (Apple でサインイン) を選択後、**[Configure] **(設定) を選択します。

   1. **[Web Authentication Configuration]** (ウェブ認証の設定) ページで、**[Primary App ID]** (プライマリアプリ ID) として前に作成したアプリ ID を選択します。

   1. **[Website URLs]** (ウェブサイトの URL) の横の **[\$1]** アイコンを選択します。

   1. **[Domains and subdomains]** (ドメインとサブドメイン) で、`https://` プレフィックスなしでユーザープールのドメインを入力します。

      ```
      mydomain.auth.us-east-1.amazoncognito.com
      ```

   1. **[Return URLs]** (URL を返す) で、ユーザープールのドメインの `/oauth2/idpresponse` エンドポイントへのパスを入力します。

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

   1. **[Next]** (次へ) を選択し、**[Done]** (完了) を選択します。ドメインを検証する必要はありません。

   1. **[Continue]** (続行) を選択し、次に **[Save]** (保存) を選択します。

1. 左のナビゲーションペインで **[Keys]** (キー) を選択します。

1. [**Keys (キー)**] ページで、[**\$1**] アイコンを選択します。

1. [**Register a New Key**] ページで、次の操作を行います。

   1. **[Key Name]** (キー名) に、キー名を入力します。

   1. **[Sign In with Apple]** (Apple でサインイン) を選択後、**[Configure]** (設定) を選択します。

   1. **[Configure Key]** (キーの設定) ページで、**プライマリアプリ ID** として前に作成したアプリ ID を選択します。**[保存]** を選択します。

   1. **[Continue]** (続行) を選択し、**[Register]** (登録) を選択します。

1. **[Download Your Key]** (鍵のダウンロード) ページで、**[Download]** (ダウンロード) をクリックしてプライベートキーをダウンロードしてから、表示される **[Key ID]** (キー ID) を書き留め、**[Done]** (完了) を選択します。このプライベートキーと、このページに表示されている **[Key ID]** (キー ID) の値は、[ソーシャル IdP を使用してユーザープールを設定する](#cognito-user-pools-social-idp-step-2) で Apple を ID プロバイダーとして選択した後で必要になります。

------

## ソーシャル IdP を使用してユーザープールを設定する
<a name="cognito-user-pools-social-idp-step-2"></a>

**を使用してユーザープールソーシャル IdP を設定するには AWS マネジメントコンソール**

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

1. **[ユーザープール]** を選択します。

1. リストから既存のユーザープールを選択するか、ユーザープールを新規作成します。

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

1. ソーシャル IdP (**[Facebook]**、**[Google]**、**[Login with Amazon]**、**[Sign in with Apple]**) を選択します。

1. ソーシャル IdP の選択に基づいて、次のステップから選択します。
   + **Google** と **Login with Amazon** (Amazon でのログイン) — 前のセクションで生成された **[app client ID]** (アプリケーションクライアント ID) と **[app client secret]** (アプリケーションクライアントシークレット) を入力します。
   + **Facebook** — 前のセクションで生成された **[app client ID]** (アプリケーションクライアント ID) と **[app client secret]** (アプリケーションクライアントシークレット) を入力し、API バージョン (例えば、バージョン 2.12) を選択します。Facebook API の各バージョンにはライフサイクルとサポート終了日があるため、可能な限り最新のバージョンを選択することをお勧めします。Facebook のスコープと属性は API バージョンによって異なる場合があります。Facebook でソーシャル ID ログインをテストして、フェデレーションが意図したとおりに機能することを確認することをお勧めします。
   + **Sign In with Apple** (Apple でのサインイン) — 以前のセクションで作成された **[Services ID]** (サービス ID)、**[Team ID]** (チーム ID)、**[Key ID]** (キー ID) および **[private key]** プライベートキーを入力します。

1. 使用したい **[Authorized scopes]** (承認するスコープ) の名前を入力します。スコープは、アプリでアクセスするユーザー属性 (`name` や `email` など) を定義します。Facebook の場合は、コンマで区切る必要があります。Google および Login with Amazon の場合は、スペースで区切って指定します。Sign in with Apple の場合は、アクセスするスコープのチェックボックスをオンにします。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-social-idp.html)

   アプリケーションユーザーは、これらの属性をアプリケーションに提供することに同意するよう求められます。ソーシャルプロバイダーのスコープの詳細については、Google、Facebook、Login with Amazon、および Sign in with Apple のドキュメントを参照してください。

   以下は、Sign in with Apple の場合にスコープが返らない可能性があるユーザーシナリオです。
   + エンドユーザーが Apple のサインインページを離れるとエラーが発生する (Amazon Cognito の内部障害またはデベロッパーが記述したプログラムが原因である可能性があります)
   + サービス ID 識別子がユーザープールや他の認証サービス全体で使用されている
   + エンドユーザーが以前にサインインしてから、デベロッパーによってさらにスコープが追加されている (新しい情報は取得されません)
   + デベロッパーによって削除されたユーザーが Apple ID プロファイルからアプリを削除せずに再度サインインしている

1. IdP からユーザープールに属性をマッピングします。詳細は、「[ユーザープール用 ID プロバイダー属性マッピングの特定](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-specifying-attribute-mapping.html)」を参照してください。

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

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

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

## ソーシャル IdP の設定をテストする
<a name="cognito-user-pools-social-idp-step-3"></a>

アプリケーションでは、ユーザーのクライアントでブラウザを起動し、ユーザーがソーシャルプロバイダーを使用してサインインできるようにする必要があります。前のセクションのセットアップ手順を完了したら、ソーシャルプロバイダーでのサインインをテストします。次の 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)からソーシャルプロバイダーへのサイレントリダイレクトを設定します。この URL は、マネージドログインによるインタラクティブなユーザープールのサインインをバイパスし、IdP サインインページに直接移動します。

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

# ユーザープールによる SAML ID プロバイダーの使用
<a name="cognito-user-pools-saml-idp"></a>

ウェブアプリケーションおよびモバイルアプリケーションのユーザーに対して、[Microsoft Active Directory フェデレーションサービス (ADFS)](https://msdn.microsoft.com/en-us/library/bb897402.aspx) や [Shibboleth](http://www.shibboleth.net/) などの SAML ID プロバイダー (IdP) を通じてサインインすることを許可できます。[SAML 2.0 標準](http://saml.xml.org/saml-specifications)をサポートする SAML IdP を選択します。

マネージドログインを使用すると、Amazon Cognito はローカルおよびサードパーティの IdP ユーザーを認証し、JSON ウェブトークン (JWT) を発行します。Amazon Cognito が発行するトークンを使用すると、複数の ID ソースを、すべてのアプリケーションにわたるユニバーサル OpenID Connect (OIDC) 標準に統合できます。Amazon Cognito は、サードパーティープロバイダーからの SAML アサーションを、その SSO 標準に処理できます。SAML IdP は、、 AWS マネジメントコンソール、 AWS CLIまたは Amazon Cognito ユーザープール API を使用して作成および管理できます。で最初の SAML IdP を作成するには AWS マネジメントコンソール、「」を参照してください[ユーザープールでの SAML ID プロバイダーの追加と管理](cognito-user-pools-managing-saml-idp.md)。

![\[SAML サインインによる認証の概要\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-authentication-saml.png)


**注記**  
サードパーティー IdP を通じたサインインによるフェデレーションは、Amazon Cognito ユーザープールの機能です。Amazon Cognito フェデレーティッド ID と呼ばれる Amazon Cognito アイデンティティプールは、各アイデンティティプールで個別に設定する必要があるフェデレーションの実装です。ユーザープールは、アイデンティティプールへのサードパーティー IdP にすることができます。詳細については、「[Amazon Cognito アイデンティティプール](cognito-identity.md)」を参照してください。

## IdP 設定のクイックリファレンス
<a name="cognito-user-pools-saml-idp-reference"></a>

リクエストを受け入れ、ユーザープールにレスポンスを送信するように SAML IdP を設定する必要があります。ユーザープールを SAML 2.0 IdP の依拠しているパーティーまたはアプリケーションとして追加する方法に関する情報は、SAML IdP のドキュメントに含まれています。次のドキュメントでは、SP エンティティ ID とアサーションコンシューマーサービス (ACS) URL に対して指定する必要がある値を示します。ユーザープール SAML 値のクイックリファレンス

**SP エンティティ ID**  

```
urn:amazon:cognito:sp:us-east-1_EXAMPLE
```

**ACS URL**  

```
https://Your user pool domain/saml2/idpresponse
```

ID プロバイダーをサポートするためにユーザープールを設定する必要があります。外部 SAML IdP を追加する大まかなステップは次のとおりです。

1. IdP から SAML メタデータをダウンロードするか、メタデータエンドポイントへの URL を取得します。「[サードパーティー SAML ID プロバイダーの設定](cognito-user-pools-integrating-3rd-party-saml-providers.md)」を参照してください。

1. ユーザープールに新しい IdP を追加します。SAML メタデータをアップロードするか、メタデータ URL を指定します。「[ユーザープールでの SAML ID プロバイダーの追加と管理](cognito-user-pools-managing-saml-idp.md)」を参照してください。

1. IdP をアプリケーションクライアントに割り当てます。「[アプリケーションクライアントによるアプリケーション固有の設定](user-pool-settings-client-apps.md)」を参照してください。

**Topics**
+ [IdP 設定のクイックリファレンス](#cognito-user-pools-saml-idp-reference)
+ [Amazon Cognito ユーザープールの SAML IdP について知っておくべきこと](cognito-user-pools-saml-idp-things-to-know.md)
+ [SAML ユーザー名の大文字と小文字の区別](#saml-nameid-case-sensitivity)
+ [サードパーティー SAML ID プロバイダーの設定](cognito-user-pools-integrating-3rd-party-saml-providers.md)
+ [ユーザープールでの SAML ID プロバイダーの追加と管理](cognito-user-pools-managing-saml-idp.md)
+ [Amazon Cognito ユーザープールでの SAML セッション開始](cognito-user-pools-SAML-session-initiation.md)
+ [シングルサインアウトで SAML ユーザーをサインアウトする](cognito-user-pools-saml-idp-sign-out.md)
+ [SAML 署名と暗号化](cognito-user-pools-SAML-signing-encryption.md)
+ [SAML ID プロバイダーの名前と識別子](cognito-user-pools-managing-saml-idp-naming.md)

# Amazon Cognito ユーザープールの SAML IdP について知っておくべきこと
<a name="cognito-user-pools-saml-idp-things-to-know"></a>

SAML 2.0 IdP の実装には、いくつかの要件と制限があります。IdP を実装する場合は、このセクションを参照してください。また、ユーザープールを使用した SAML フェデレーション中に生じるエラーのトラブルシューティングに役立つ情報もあります。

**Amazon Cognito は SAML アサーションを処理する**  
Amazon Cognito ユーザープールは、POST バインドエンドポイントで SAML 2.0 フェデレーションをサポートします。これにより、ユーザープールがユーザーエージェント経由で IdP から直接 SAML レスポンスを受信するため、アプリケーションで SAML アサーションレスポンスを受信して解析する必要がなくなります。ユーザープールはアプリケーションのためのサービスプロバイダー (SP) として機能します。Amazon Cognito は、「[SAML V2.0 Technical Overview](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html)」のセクション 5.1.2 と 5.1.4 で説明されている、SP または IdP によるシングルサインオン (SSO) をサポートしています。

**有効な IdP 署名証明書を提供する**  
ユーザープールで SAML IdP を設定するときに、SAML プロバイダーメタデータの署名証明書の有効期限が切れないようにする必要があります。

**ユーザープールが複数の署名証明書をサポートする**  
SAML IdP の SAML メタデータに複数の署名証明書が含まれている場合、サインイン時に、SAML アサーションが SAML メタデータ内のいずれかの証明書と一致すると、ユーザープールは SAML アサーションが有効であると判断します。各署名証明書の長さは 4,096 文字以下にする必要があります。

**リレー状態パラメータを維持する**  
Amazon Cognito と SAML IdP は、セッション情報を `relayState` パラメータで管理します。  

1. Amazon Cognito は、80 バイトを超える `relayState` 値をサポートします。SAML 仕様では、`relayState` の値は「長さが 80 バイトを超えてはならない」と規定されていますが、現在の業界の慣行はこの動作から外れていることがよくあります。その結果、80 バイトを超える `relayState` 値を拒否すると、多くの標準的な SAML プロバイダーの統合は壊れます。

1. `relayState` トークンは、Amazon Cognito が管理する状態情報への不透明な参照です。Amazon Cognito は `relayState` パラメータの内容を保証しません。その内容を解析してアプリケーションでその結果に依存することは避けてください。詳細については、「[SAML 2.0 の仕様](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html)」を参照してください。

**ACS エンドポイントを特定する**  
SAML ID プロバイダーは、アサーションコンシューマーエンドポイントを設定することを要求します。IdP は、SAML アサーションを使用して、このエンドポイントにユーザーをリダイレクトします。SAML ID プロバイダーの SAML 2.0 POST バインド用に、ユーザープールドメインで次のエンドポイントを設定します。  

```
https://Your user pool domain/saml2/idpresponse
With an Amazon Cognito domain:
https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse
With a custom domain:
https://auth.example.com/saml2/idpresponse
```
ユーザープールドメインの詳細については、「[ユーザープールのドメインを設定する](cognito-user-pools-assign-domain.md)」を参照してください。

**アサーションの再生ができない**  
Amazon Cognito の `saml2/idpresponse` エンドポイントに対して SAML アサーションを繰り返したり、*再生*したりすることはできません。SAML アサーションを作成すると、そのアサーション ID は以前の IdP レスポンスの ID と重複します。

**ユーザープール ID は SP エンティティ ID である**  
IdP については、*オーディエンス URI* または *SP エンティティ ID* とも呼ばれるサービスプロバイダー (SP) `urn` のユーザープール ID で指定する必要があります。ユーザープールのオーディエンス URI の形式は次のとおりです。  

```
urn:amazon:cognito:sp:us-east-1_EXAMPLE
```
ユーザープール ID は、[Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)の **[ユーザープールの概要]** で確認できます。

**必要なすべての属性をマッピングする**  
ユーザープールで必須として設定した属性の値を入力するように SAML IdP を設定します。例えば、`email` はユーザープールの一般的な必須属性です。ユーザーがサインインする前に、**ユーザープール属性** `email` にマッピングするクレームを SAML IdP アサーションに含める必要があります。属性のマッピングの詳細については、「[IdP 属性をプロファイルとトークンにマッピングする](cognito-user-pools-specifying-attribute-mapping.md)」を参照してください。

**アサーション形式には特定の要件がある**  
SAML IdP には、SAML アサーションに次のクレームを含める必要があります。  
+ `NameID` クレーム。Amazon Cognito は、`NameID` によって SAML アサーションを送信先ユーザーと関連付けます。`NameID` が変更になった場合、Amazon Cognito はアサーションを新しいユーザー用と見なします。IdP 設定で `NameID` に設定する属性には永続的な値が必要です。SAML ユーザーをユーザープール内の一貫したユーザープロファイルに割り当てるには、変更されない値を持つ属性からの `NameID` クレームを割り当てます。

  ```
  <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:persistent">
    carlos
  </saml2:NameID>
  ```

  IdP `NameID` クレームの `Format` で `urn:oasis:names:tc:SAML:1.1:nameid-format:persistent` は、IdP が変更のない値を渡していることを示します。Amazon Cognito は、この形式の宣言を必要とせず、IdP が `NameID` クレームの形式を指定しない場合、`urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified` の形式を割り当てます。この動作は、[SAML 2.0 仕様](https://groups.oasis-open.org/higherlogic/ws/public/download/35711/sstc-saml-core-errata-2.0-wd-06-diff.pdf/latest)のセクション 2.2.2 (*複合タイプ NameIDType*) に準拠しています。
+ ユーザープールの SP エンティティ ID をレスポンスのターゲットとして設定する値 `Audience` を含む `AudienceRestriction` クレーム。

  ```
  <saml:AudienceRestriction>
    <saml:Audience> urn:amazon:cognito:sp:us-east-1_EXAMPLE
  </saml:AudienceRestriction>
  ```
+ SP が開始したシングルサインオンの場合、元の SAML リクエスト ID の `InResponseTo` 値を持つ `Response` 要素。

  ```
  <saml2p:Response Destination="https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse" ID="id123" InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" IssueInstant="Date-time stamp" Version="2.0" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  ```
**注記**  
IdP が開始した SAML アサーションに `InResponseTo` 値を含めることは*できません*。
+ ユーザープール `saml2/idpresponse` エンドポイントの `Recipient` 値と、SP が開始した SAML の場合の、元の SAML リクエスト ID と一致する `InResponseTo` 値を含む `SubjectConfirmationData` 要素。

  ```
  <saml2:SubjectConfirmationData InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" NotOnOrAfter="Date-time stamp" Recipient="https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse"/>
  ```

**SP が開始したサインインリクエスト**  
[認可エンドポイント](authorization-endpoint.md)がユーザーを IdP サインインページにリダイレクトすると、Amazon Cognito は `HTTP GET` リクエストの URL パラメータに *SAML リクエスト*を含めます。SAML リクエストには、ACS エンドポイントなどの、ユーザープールに関する情報が含まれます。オプションで、これらのリクエストに暗号化署名を適用できます。

**リクエストへの署名とレスポンスの暗号化**  
SAML プロバイダーを持つすべてのユーザープールは、Amazon Cognito が SAML リクエストに割り当てるデジタル署名の非対称キーペアと*署名証明書*を生成します。暗号化された SAML レスポンスをサポートするように設定したすべての外部 SAML IdP により、Amazon Cognito は、そのプロバイダーの新しいキーペアと*暗号化証明書*を生成します。パブリックキーを使用して証明書の表示とダウンロードを行うには、Amazon Cognito コンソールの **[ソーシャルプロバイダーと外部プロバイダー]** メニューで IdP を選択します。  
ユーザープールからの SAML リクエストとの信頼を確立するには、ユーザープールの SAML 2.0 署名証明書のコピーを IdP に提供します。署名付きリクエストを受け入れるように IdP を設定しない場合、IdP はユーザープールが署名した SAML リクエストを無視する可能性があります。  

1. Amazon Cognito は、ユーザーが IdP に渡す SAML リクエストにデジタル署名を適用します。ユーザープールは、すべてのシングルログアウト (SLO) リクエストに署名しますが、SAML 外部 IdP のシングルサインオン (SSO) リクエストに署名するようにユーザープールを設定できます。証明書のコピーを提供すると、IdP はユーザーの SAML リクエストの整合性を検証できます。

1. SAML IdP は、暗号化証明書を使用して SAML レスポンスを暗号化できます。SAML 暗号化を使用して IdP を設定する場合、IdP は、暗号化されたレスポンスのみを送信する必要があります。

**アルファベット以外の文字のエンコードを行う**  
Amazon Cognito では、IdP が属性値として渡す 4 バイトの UTF-8 文字 (😐 や 𠮷 など) は受け付けません。文字を Base 64 にエンコードしてテキストとして渡し、アプリでデコードできます。  
次の例では、属性のクレームは受け付けられません。  

```
<saml2:Attribute Name="Name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
  <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">😐</saml2:AttributeValue>
</saml2:Attribute>
```
上記の例とは対照的に、次の属性のクレームは受け付けられます。  

```
<saml2:Attribute Name="Name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
  <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">8J+YkA==</saml2:AttributeValue>
</saml2:Attribute>
```

**メタデータエンドポイントには、有効な Transport Layer Security (TLS) が必要である**  
HTTPS メタデータエンドポイント URL を使用して SAML IdP を作成中に `InvalidParameterException` (例えば「Error retrieving metadata from *<metadata endpoint>*」) が表示される場合、メタデータエンドポイントの SSL が正しくセットアップされていること、および有効な SSL 証明書が関連付けられていることを確認してください。詳細については、「[SSL/TLS 証明書とは何ですか?](https://aws.amazon.com/what-is/ssl-certificate/)」を参照してください。

**メタデータエンドポイントは HTTP または HTTPS の標準 TCP ポート上に存在する必要がある**  
Amazon Cognito は、HTTP の場合は標準 TCP ポート 80、HTTPS の場合は 443 でのみ、SAML プロバイダーのメタデータ URL を受け入れます。セキュリティのベストプラクティスとして、SAML メタデータは、`https://` プレフィックスを付けた TLS 暗号化 URL でホストします。メタデータ URL は、*`http://www.example.com/saml2/metadata.xml`* または *`https://www.example.com/saml2/metadata.xml`* の形式で入力します。Amazon Cognito コンソールは、`https://` プレフィックスが付いたメタデータ URL のみを受け入れます。[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) と [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) を使用して IdP メタデータを設定することもできます。

**IdP が開始した SAML を持つアプリケーションクライアントは SAML でのみサインインできる**  
アプリケーションクライアントで、IdP が開始した署名をサポートする SAML 2.0 IdP のサポートを有効にすると、そのアプリケーションクライアントに追加できるのは他の SAML 2.0 IdP のみになります。この方法で設定されたアプリケーションクライアントには、ユーザープール内のユーザーディレクトリ*と*すべての非 SAML 外部 ID プロバイダーを追加することはできません。

**ログアウトレスポンスには POST バインディングを使用する必要がある**  
`/saml2/logout` エンドポイントは、`HTTP POST` リクエストとして `LogoutResponse` を受け入れます。ユーザープールは、`HTTP GET` バインディングによるログアウトレスポンスを受け入れません。

**メタデータ署名証明書のローテーション**  
URL でメタデータを提供すると、Amazon Cognito は、SAML メタデータを最大 6 時間キャッシュします。メタデータ署名証明書のローテーションを実行する場合は、元の証明書と新しい証明書の*両方*を少なくとも 6 時間公開するようにメタデータソースを設定します。Amazon Cognito がメタデータ URL からキャッシュを更新すると、各証明書は有効と見なされ、SAML IdP は新しい証明書を使用して SAML アサーションの署名を開始できます。この期間が経過したら、公開したメタデータから元の証明書を削除できます。

## SAML ユーザー名の大文字と小文字の区別
<a name="saml-nameid-case-sensitivity"></a>

フェデレーションユーザーがサインインしようとすると、SAML ID プロバイダー (IdP) はユーザーの SAML アサーションで Amazon Cognito に一意の `NameId` を渡します。Amazon Cognito は、SAML フェデレーティッドユーザーを `NameId` クレームによって識別します。ユーザープールの大文字と小文字の区別の設定にかかわらず、Amazon Cognito では、大文字と小文字を区別する一意の `NameId` クレームを渡すときに、SAML IdP の既存フェデレーションユーザーを認識します。`email` のような属性を `NameId` にマッピングし、ユーザーが E メールアドレスを変更すると、アプリケーションにサインインできません。

変更されない値を持つ IdP 属性から SAML アサーションに `NameId` をマッピングします。

例えば、Carlos は、`Carlos@example.com` の `NameId` 値を渡した Active Directory フェデレーションサービス (ADFS) SAML アサーションからの大文字と小文字を区別しないユーザープールにユーザープロファイルを持っているとします。次回 Carlos がサインインしようとすると、ADFS IdP は `carlos@example.com` の `NameId` 値を渡します。`NameId` は大文字と小文字が完全に一致する必要があるため、サインインは成功しません。

`NameID` を変更した後、ユーザーがログインできない場合は、ユーザープールからそのユーザーのプロファイルを削除してください。Amazon Cognito は、次回サインインしたときに新しいユーザープロファイルを作成します。

**Topics**
+ [IdP 設定のクイックリファレンス](#cognito-user-pools-saml-idp-reference)
+ [Amazon Cognito ユーザープールの SAML IdP について知っておくべきこと](cognito-user-pools-saml-idp-things-to-know.md)
+ [SAML ユーザー名の大文字と小文字の区別](#saml-nameid-case-sensitivity)
+ [サードパーティー SAML ID プロバイダーの設定](cognito-user-pools-integrating-3rd-party-saml-providers.md)
+ [ユーザープールでの SAML ID プロバイダーの追加と管理](cognito-user-pools-managing-saml-idp.md)
+ [Amazon Cognito ユーザープールでの SAML セッション開始](cognito-user-pools-SAML-session-initiation.md)
+ [シングルサインアウトで SAML ユーザーをサインアウトする](cognito-user-pools-saml-idp-sign-out.md)
+ [SAML 署名と暗号化](cognito-user-pools-SAML-signing-encryption.md)
+ [SAML ID プロバイダーの名前と識別子](cognito-user-pools-managing-saml-idp-naming.md)

# サードパーティー SAML ID プロバイダーの設定
<a name="cognito-user-pools-integrating-3rd-party-saml-providers"></a>

SAML ID プロバイダー (IdP) をユーザープールに追加する場合は、IdP の管理インターフェイスで設定を更新する必要があります。このセクションでは、IdP に提供する必要がある値をフォーマットする方法について説明します。また、IdP とそのユーザープールへの SAML クレームを識別する静的なまたはアクティブな URL メタデータドキュメントを取得する方法についても説明します。

Amazon Cognito ユーザープールのフェデレーションと連携するようにサードパーティー SAML 2.0 ID プロバイダー (IdP) ソリューションを設定するには、次のアサーションコンシューマーサービス (ACS) の URL にリダイレクトするように SAML IdP を設定する必要があります: `https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse`。ユーザープールに Amazon Cognito ドメインがある場合は、[Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)のユーザープールの **[ドメイン]** メニューでユーザープールドメインのパスを見つけることができます。

一部の SAML IdP では、オーディエンス URI または SP エンティティ ID とも呼ばれる `urn` を `urn:amazon:cognito:sp:us-east-1_EXAMPLE`　の形式で指定する必要があります。ユーザープール ID は、Amazon Cognito コンソールの **[ユーザープールの概要]** で確認できます。

また、SAML IdP を設定して、ユーザープールの*必須属性*として指定した属性の値を指定する必要もあります。通常、`email` はユーザープールに必要な属性です。この場合、SAML IdP は、SAML アサーションに何らかの形式の `email` クレームを指定し、そのクレームをそのプロバイダーの属性にマッピングする必要があります。

サードパーティーの SAML 2.0 IdP ソリューションについての以下の設定情報は、Amazon Cognito ユーザープールでフェデレーションのセットアップを開始するのに適しています。最新情報については、プロバイダーのドキュメントを直接参照してください。

SAML リクエストに署名するには、ユーザープール署名証明書によって署名されたリクエストを信頼するように IdP を設定する必要があります。暗号化された SAML レスポンスを受け入れるには、ユーザープールへの*すべての* SAML レスポンスを暗号化するように IdP を設定する必要があります。プロバイダーは、これらの機能の設定に関するドキュメントを用意します。Microsoft の例については、「[Microsoft Entra の SAML トークン暗号化を構成する](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/howto-saml-token-encryption)」を参照してください。

**注記**  
Amazon Cognito では、ID プロバイダーのメタデータドキュメントのみが必要です。プロバイダーによっては、IAM または AWS IAM アイデンティティセンターとの SAML 2.0 フェデレーション用にカスタマイズした設定情報を提供している場合もあります。Amazon Cognito 統合を設定する方法については、メタデータに関するドキュメントを取得する一般的な手順を確認し、ユーザープールで残りの設定を管理してください。


| ソリューション | 詳細情報 | 
| --- | --- | 
| Microsoft Entra ID | [フェデレーションメタデータ](https://learn.microsoft.com/en-us/entra/identity-platform/federation-metadata) | 
| Okta | [SAML アプリケーション統合の IdP メタデータと SAML 署名証明書をダウンロードする方法](https://support.okta.com/help/s/article/Location-to-download-Okta-IDP-XML-metadata-for-a-SAML-app-in-the-new-Admin-User-Interface) | 
| Auth0 | [Auth0 を SAML ID プロバイダーとして設定する](https://auth0.com/docs/authenticate/protocols/saml/saml-sso-integrations/configure-auth0-saml-identity-provider) | 
| Ping Identity (PingFederate) | [PingFederate からの SAML メタデータのエクスポート](https://docs.pingidentity.com/integrations/contentful/configuring_single_sign-on/pf_contentful_integration_exporting_saml_metadata_from_pf.html) | 
| JumpCloud | [SAML 設定に関する注意事項](https://jumpcloud.com/support/saml-configuration-notes) | 
| SecureAuth | [SAML アプリケーション統合](https://docs.secureauth.com/2104/en/saml-application-integration.html) | 

# ユーザープールでの SAML ID プロバイダーの追加と管理
<a name="cognito-user-pools-managing-saml-idp"></a>

Amazon Cognito を操作するように ID プロバイダーを設定したら、ユーザープールとアプリケーションクライアントに追加できます。次の手順は、Amazon Cognito ユーザープールで SAML プロバイダーの作成、変更、削除を行う方法を示しています。

------
#### [ AWS マネジメントコンソール ]

を使用して、SAML ID プロバイダー (IdPs AWS マネジメントコンソール を作成および削除できます。

SAML IdP を作成する前に、サードパーティー IdP から取得した SAML メタデータドキュメントが必要です。必要な SAML メタデータドキュメントの取得または生成方法については、「[サードパーティー SAML ID プロバイダーの設定](cognito-user-pools-integrating-3rd-party-saml-providers.md)」を参照してください。

**ユーザープールに SAML 2.0 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. **[SAML]** IdP を選択します。

1. **プロバイダー名**を入力します。このわかりやすい名前を、`identity_provider` リクエストパラメータで [認可エンドポイント](authorization-endpoint.md) に渡すことができます。

1. カンマで区切られた **[Identifiers]** (識別子) を入力します。識別子は Amazon Cognito に、ユーザーがサインインしたときに入力したメールアドレスを確認し、ドメインに対応するプロバイダーに誘導する必要があることを伝えます。

1. ユーザーがログアウトしたときに、Amazon Cognito が署名されたサインアウト要求をプロバイダーに送信するためには、**[Add sign-out flow]** (サインアウトフローの追加) を選択します。マネージドログインの設定時に作成した `https://mydomain.auth.us-east-1.amazoncognito.com/saml2/logout` エンドポイントにサインアウトレスポンスを送信するよう、SAML 2.0 IdP を設定する必要があります。`saml2/logout` エンドポイントでは、ポストバインディングを使用します。
**注記**  
このオプションを選択し、SAML IdP が署名付きログアウトリクエストを期待する場合は、SAML IdP に対して、ユーザープールからの署名証明書を提供する必要もあります。  
SAML IdP は署名されたログアウトリクエストを処理し、Amazon Cognito セッションからユーザーをサインアウトさせます。

1. **[IdP が開始した SAML サインイン]** 設定を選択します。セキュリティのベストプラクティスとして、**[SP が開始した SAML アサーションのみを受け入れる]** を選択します。未承諾の SAML サインインセッションを安全に受け入れる環境を準備している場合は、**[SP が開始した/IdP が開始した SAML アサーションを受け入れる]** を選択します。詳細については、「[Amazon Cognito ユーザープールでの SAML セッション開始](cognito-user-pools-SAML-session-initiation.md)」を参照してください。

1. **[Metadata document source]** (メタデータドキュメントソース) を選択します。IdP がパブリック URL で SAML メタデータを提供する場合は、**[Metadata document URL]** (メタデータドキュメント URL) を選択してそのパブリック URL を入力できます。それ以外の場合は、**[Upload metadata document]** (メタデータドキュメントをアップロード) を選択し、プロバイダーから以前ダウンロードしたメタデータファイルを選択します。
**注記**  
プロバイダーにパブリックエンドポイントがある場合は、ファイルをアップロードするのではなく、メタデータドキュメントの URL を入力することをお勧めします。Amazon Cognito は、メタデータ URL からのメタデータを自動的に更新します。通常、メタデータの更新は 6 時間ごとまたはメタデータの有効期限が切れる前のいずれか早いタイミングで発生します。

1. **[SAML プロバイダーとユーザープール間で属性をマッピング]** をクリックして、SAML プロバイダーの属性をユーザープールのユーザープロファイルにマッピングします。ユーザープールの必須属性を属性マップに含めます。

   例えば、**[User pool attribute]** (ユーザープール属性) `email` を選択する場合、IdP からの SAML アサーションに表示される SAML 属性名を入力します。IdP がサンプル SAML アサーションを提供している場合は、これらのサンプルアサーションを使用して名前を見つけやすいかもしれません。`email` などの単純な名前を使用している IdP もあれば、次のような名前を使用している IdP もあります。

   ```
   http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
   ```

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

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

SAML ID プロバイダー (IdP) を作成して管理するには、以下のコマンドを使用します。

**IdP を作成し、メタデータドキュメントをアップロードする**
+ AWS CLI: `aws cognito-idp create-identity-provider`

  メタデータファイルの例: `aws cognito-idp create-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-type SAML --provider-details file:///details.json --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`

  ここでは `details.json` に以下が含まれます。

  ```
  "ProviderDetails": { 
        "MetadataFile": "<SAML metadata XML>",
        "IDPSignout" : "true",
        "RequestSigningAlgorithm" : "rsa-sha256",
        "EncryptedResponses" : "true",
        "IDPInit" : "true"
  }
  ```
**注記**  
*<SAML メタデータ XML>* に文字 `"` のインスタンスが含まれている場合は、エスケープ文字の `\` を追加して、次のようにする必要があります: `\"`。

  メタデータ URL の例: `aws cognito-idp create-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-type SAML --provider-details MetadataURL=https://myidp.example.com/sso/saml/metadata --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`
+ AWS API: [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html)

**IdP の新規メタデータドキュメントをアップロードする**
+ AWS CLI: `aws cognito-idp update-identity-provider`

  メタデータファイルの例: `aws cognito-idp update-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-details file:///details.json --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`

  ここでは `details.json` に以下が含まれます。

  ```
  "ProviderDetails": { 
        "MetadataFile": "<SAML metadata XML>",
        "IDPSignout" : "true",
        "RequestSigningAlgorithm" : "rsa-sha256",
        "EncryptedResponses" : "true",
        "IDPInit" : "true"
  }
  ```
**注記**  
*<SAML メタデータ XML>* に文字 `"` のインスタンスが含まれている場合は、エスケープ文字の `\` を追加して、次のようにする必要があります: `\"`。

  メタデータ URL の例: `aws cognito-idp update-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-details MetadataURL=https://myidp.example.com/sso/saml/metadata --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`
+ AWS API: [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html)

**固有の IdP に関する情報を取得するには**
+ AWS CLI: `aws cognito-idp describe-identity-provider`

  `aws cognito-idp describe-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1`
+ AWS API: [DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html)

**すべての IdP に関する情報を一覧表示するには**
+ AWS CLI: `aws cognito-idp list-identity-providers`

  例: `aws cognito-idp list-identity-providers --user-pool-id us-east-1_EXAMPLE --max-results 3`
+ AWS API: [ListIdentityProviders](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListIdentityProviders.html)

**IdP を削除する**
+ AWS CLI: `aws cognito-idp delete-identity-provider`

  `aws cognito-idp delete-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1`
+ AWS API: [DeleteIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteIdentityProvider.html)

------

**ユーザープールを証明書利用者として追加するために SAML IdP をセットアップする**
+ ユーザープールのサービスプロバイダー URN は `urn:amazon:cognito:sp:us-east-1_EXAMPLE` です。Amazon Cognito には、SAML レスポンスでこの URN に一致するオーディエンス制限値が必要です。お客様の IdP は、次の POST バインディングエンドポイントを IdP-to-SP 応答メッセージに使用します。

  ```
  https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse
  ```
+ SAML IdP によって、SAML アサーションの `NameID` およびユーザープール必須属性が入力されている必要があります。`NameID` は、ユーザープールの SAML フェデレーションユーザーを一意に識別するために使用されます。IdP は、各ユーザーの SAML 名 ID を、大文字と小文字を区別する一貫した形式で渡す必要があります。ユーザー名 ID の値にバリエーションがあると、新しいユーザープロファイルが作成されます。

**SAML 2.0 IDP にデジタル署名用証明書を提供するには**
+ IdP が SAML ログアウトリクエストの検証に使用できるパブリックキーのコピーを Amazon Cognito からダウンロードするには、ユーザープールの **[ソーシャルプロバイダーと外部プロバイダー]** メニューを選択して IdP を選択し、**[署名用証明書を表示]** で **[.crt としてダウンロード]** を選択します。

Amazon Cognito コンソールを使用して、ユーザープールで設定した SAML プロバイダーを削除できます。

**SAML プロバイダーを削除する**

1. [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito/home)にサインインします。

1. ナビゲーションペインで **[User Pools]** (ユーザープール) を選択してから、編集するユーザープールを選択します。

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

1. 削除する SAML IdP の横のラジオボタンを選択します。

1. **[Delete identity provider]** (ID プロバイダーの削除) のプロンプトが表示されたら、SAML プロバイダー名を入力して削除を確認し、**[Delete]** (削除) を選択します。

# Amazon Cognito ユーザープールでの SAML セッション開始
<a name="cognito-user-pools-SAML-session-initiation"></a>

Amazon Cognito は、サービスプロバイダーが開始した (SP が開始した) シングルサインオン (SSO) と IdP が開始した SSO をサポートしています。セキュリティのベストプラクティスとして、SP が開始した SSO をユーザープールに実装します。[SAML V2.0 技術概要](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html#5.1.2.SP-Initiated%20SSO:%20%20Redirect/POST%20Bindings|outline)のセクション 5.1.2 では、SP で開始される SSO について説明します。Amazon Cognito は、アプリケーションの ID プロバイダー (IdP) です。アプリケーションは、認証されたユーザーのトークンを取得するサービスプロバイダー (SP) です。ただし、サードパーティー IdP を使用してユーザーを認証する場合、Amazon Cognito は SP です。SAML 2.0 ユーザーが、SP が開始したフローで認証する場合、常に Amazon Cognito にリクエストを行い、認証のために IdP にリダイレクトする必要があります。

一部のエンタープライズユースケースでは、内部アプリケーションへのアクセスは Enterprise IdP がホストするダッシュボードのブックマークから始まります。ユーザーがブックマークを選択すると、IdP は SAML 応答を生成して SP に送信し、アプリケーションでユーザーを認証します。

IdP が開始した SSO をサポートするように、ユーザープールで SAML IdP を設定できます。IdP が開始した認証をサポートする場合、Amazon Cognito は SAML リクエストで認証を開始しないため、受信した SAML レスポンスを要請したことを検証できません。SP が開始した SSO では、Amazon Cognito は、元のリクエストに対して SAML レスポンスを検証する状態パラメータを設定します。SP が開始したサインインを使用すると、クロスサイトリクエストフォージェリ (CSRF) から保護することもできます。

**Topics**
+ [SP が開始した SAML サインインを実装する](#cognito-user-pools-saml-idp-authentication)
+ [IdP が開始した SAML サインインを実装する](#cognito-user-pools-SAML-session-initiation-idp-initiation)

## SP が開始した SAML サインインを実装する
<a name="cognito-user-pools-saml-idp-authentication"></a>

ベストプラクティスとして、ユーザープールに、サービスプロバイダーが開始した (SP が開始した) サインインを実装します。Amazon Cognito はユーザーのセッションを開始し、IdP にリダイレクトします。この方法を使用すると、サインインリクエストを提示するユーザーの制御が最大になります。特定の条件下で、IdP が開始したサインインを許可することもできます。

以下のプロセスは、ユーザーが SAML プロバイダーを介してユーザープールへの SP が開始したサインインを完了する方法を示しています。

![\[Amazon Cognito の SP が開始した SAML サインインの認証フロー図。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-authentication-saml-stepbystep.png)


1. ユーザーはサインインページで E メールアドレスを入力します。ユーザーを IdP にリダイレクトすることを決めるには、カスタム構築したアプリケーションで E メールアドレスを収集するか、ウェブビューでマネージドログインを呼び出すことができます。

   IdP を一覧表示するか、E メールアドレスの入力を求めて SAML IdP の識別子と照合するように、マネージドログインページを設定できます。E メールアドレスの入力を求めるには、マネージドログインのブランディングスタイルを編集し、**[基盤]** で **[認証動作]** を見つけ、**[プロバイダーの表示]** で **[表示スタイル]** を **[ドメイン検索入力]** に設定します。

1. アプリケーションは、ユーザープールリダイレクトエンドポイントを呼び出し、アプリケーションに対応するクライアント ID と、ユーザーに対応する IdP ID を持つセッションをリクエストします。

1. Amazon Cognito は、`AuthnRequest` 要素内の、[オプションで署名された](cognito-user-pools-SAML-signing-encryption.md#cognito-user-pools-SAML-signing.title)、SAML リクエストを使用して、ユーザーを IdP にリダイレクトします。

1. IdP は、インタラクティブに、またはブラウザ Cookie で記憶されたセッションを使用して、ユーザーを認証します。

1. IdP は、POST ペイロードで、[オプションで暗号化された](cognito-user-pools-SAML-signing-encryption.md#cognito-user-pools-SAML-signing-encryption.title) SAML アサーションを使用して、ユーザーをユーザープールの SAML レスポンスエンドポイントにリダイレクトします。
**注記**  
Amazon Cognito は、5 分以内にレスポンスを受信しないセッションをキャンセルし、ユーザーをマネージドログインにリダイレクトします。ユーザーにこの結果が生じると、`Something went wrong` エラーメッセージを受け取ります。

1. SAML アサーションが検証され、レスポンスのクレームから[ユーザー属性がマッピング](cognito-user-pools-specifying-attribute-mapping.md#cognito-user-pools-specifying-attribute-mapping.title)されると、Amazon Cognito がユーザープールのユーザープロファイルを内部で作成または更新します。通常、ユーザープールはユーザーのブラウザセッションに認可コードを返します。

1. ユーザーは、認可コードをアプリケーションに提示します。アプリケーションはコードを JSON ウェブトークン (JWT) と交換します。

1. アプリケーションは、ユーザーの ID トークンを認証として受け入れて処理し、アクセストークンを使用してリソースへの認可されたリクエストを生成し、更新トークンを保存します。

ユーザーが認証して、認可コード付与を受け取ると、ユーザープールは ID、アクセス、更新トークンを返します。ID トークンは、OIDC ベースの ID 管理用の認証オブジェクトです。アクセストークンは、[OAuth 2.0](https://oauth.net/2/) スコープを持つ認可オブジェクトです。更新トークンは、ユーザーの現在のトークンの有効期限が切れたときに新しい ID トークンとアクセストークンを生成するオブジェクトです。ユーザープールアプリケーションクライアントでユーザーのトークンの期間を設定できます。

更新トークンの期間を選択することもできます。ユーザーの更新トークンの有効期限が切れたら、再度サインインする必要があります。SAML IdP を介して認証された場合、ユーザーのセッション期間は、IdP とのセッションの有効期限ではなく、トークンの有効期限によって設定されます。アプリケーションは、各ユーザーの更新トークンを保存し、有効期限が切れたらセッションを更新する必要があります。マネージドログインは、1 時間有効なブラウザ Cookie でユーザーセッションを維持します。

## IdP が開始した SAML サインインを実装する
<a name="cognito-user-pools-SAML-session-initiation-idp-initiation"></a>

IdP が開始した SAML 2.0 サインイン用に ID プロバイダーを設定すると、[認可エンドポイント](authorization-endpoint.md) でセッションを開始することなく、ユーザープールドメインの `saml2/idpresponse` エンドポイントに SAML アサーションを提示できます。この設定を持つユーザープールは、リクエストされたアプリケーションクライアントがサポートするユーザープールの外部 ID プロバイダーから、IdP が開始した SAML アサーションを受け入れます。

![\[Amazon Cognito の IdP が開始した SAML サインインの認証フロー図。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-authentication-saml-idpinit.png)


1. ユーザーがアプリケーションで SAML サインインをリクエストします。

1. アプリケーションは、ブラウザを起動するか、SAML プロバイダーのサインインページにユーザーをリダイレクトします。

1. IdP は、インタラクティブに、またはブラウザ Cookie で記憶されたセッションを使用して、ユーザーを認証します。

1. IdP は、POST 本文の SAML アサーションまたはレスポンスを使用して、ユーザーをアプリケーションにリダイレクトします。

1. アプリケーションは、ユーザープールの `saml2/idpresponse` エンドポイントへのリクエストの POST 本文に SAML アサーションを追加します。

1. Amazon Cognito は、ユーザーに認証コードを発行します。

1. ユーザーは、認可コードをアプリケーションに提示します。アプリケーションはコードを JSON ウェブトークン (JWT) と交換します。

1. アプリケーションは、ユーザーの ID トークンを認証として受け入れて処理し、アクセストークンを使用してリソースへの認可されたリクエストを生成し、更新トークンを保存します。

次の手順では、IdP が開始した SAML 2.0 プロバイダーを使用した設定とサインインの全体的なプロセスについて説明します。

1. ユーザープールとアプリケーションクライアントを作成または指定します。

1. ユーザープールで SAML 2.0 IdP を作成します。

1. IdP の開始をサポートするように IdP を設定します。IdP が開始した SAML では、他の SSO プロバイダーには適用されないセキュリティ上の考慮事項が導入されています。このため、IdP が開始したサインインで SAML プロバイダーを使用するアプリケーションクライアントに、ユーザープール自体を含む非 SAML IdP を追加することはできません。

1. IdP が開始した SAML プロバイダーを、ユーザープール内のアプリケーションクライアントに関連付けます。

1. SAML IdP のサインインページにユーザーを誘導し、SAML アサーションを取得します。

1. SAML アサーションを使用して、ユーザーをユーザープール `saml2/idpresponse` エンドポイントに誘導します。

1. JSON ウェブトークン (JWT) を受け取ります。

ユーザープールで未承諾の SAML アサーションを受け入れるには、アプリケーションセキュリティへの影響を考慮する必要があります。リクエストスプーフィングと CSRF の試行は、IdP が開始したリクエストを受け入れるときに行われる可能性があります。ユーザープールは IdP が開始したサインインセッションを検証できませんが、Amazon Cognito はリクエストパラメータと SAML アサーションを検証します。

さらに、SAML アサーションに `InResponseTo` クレームが含まれておらず、過去 6 分以内に発行されている必要があります。

IdP が開始した SAML を使用してリクエストを `/saml2/idpresponse` に送信する必要があります。SP が開始した認可リクエストおよびマネージドログインの認可リクエストの場合、リクエストされたアプリケーションクライアント、スコープ、リダイレクト URI、その他の詳細を識別するパラメータを、`HTTP GET` リクエストのクエリ文字列パラメータとして指定する必要があります。ただし、IdP が開始した SAML アサーションの場合、リクエストの詳細は、`HTTP POST` リクエスト本文の `RelayState` パラメータとしてフォーマットする必要があります。また、リクエスト本文には、SAML アサーションを `SAMLResponse` パラメータとして含める必要もあります。

次に示すのは、IdP が開始した SAML プロバイダーのリクエストとレスポンスの例です。

```
POST /saml2/idpresponse HTTP/1.1
User-Agent: USER_AGENT
Accept: */*
Host: example.auth.us-east-1.amazoncognito.com
Content-Type: application/x-www-form-urlencoded

SAMLResponse=[Base64-encoded SAML assertion]&RelayState=identity_provider%3DMySAMLIdP%26client_id%3D1example23456789%26redirect_uri%3Dhttps%3A%2F%2Fwww.example.com%26response_type%3Dcode%26scope%3Demail%2Bopenid%2Bphone

HTTP/1.1 302 Found
Date: Wed, 06 Dec 2023 00:15:29 GMT
Content-Length: 0
x-amz-cognito-request-id: 8aba6eb5-fb54-4bc6-9368-c3878434f0fb
Location: https://www.example.com?code=[Authorization code]
```

------
#### [ AWS マネジメントコンソール ]

**IdP が開始した SAML の IdP を設定するには**

1. [ユーザープール](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[アプリケーションクライアント](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)、および SAML ID プロバイダーを作成します。

1. 関連付けられている場合、すべてのソーシャル ID プロバイダーと OIDC ID プロバイダーについてアプリケーションクライアントから関連付けを解除します。

1. ユーザープールの **[ソーシャルプロバイダーと外部プロバイダー]** メニューに移動します。

1. SAML プロバイダーを編集または追加します。

1. **[IdP が開始した SAML サインイン]** で、**[SP が開始した/IdP が開始した SAML アサーションを受け入れる]** を選択します。

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

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

**IdP が開始した SAML の IdP を設定するには**

[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) API リクエストまたは [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API リクエストの `IDPInit` パラメータを使用して、IdP が開始した SAML を設定します。以下は、IdP が開始した SAML をサポートする IdP の `ProviderDetails` の例です。

```
"ProviderDetails": { 
      "MetadataURL" : "https://myidp.example.com/saml/metadata",
      "IDPSignout" : "true",
      "RequestSigningAlgorithm" : "rsa-sha256",
      "EncryptedResponses" : "true",
      "IDPInit" : "true"
}
```

------

# シングルサインアウトで SAML ユーザーをサインアウトする
<a name="cognito-user-pools-saml-idp-sign-out"></a>

Amazon Cognito は SAML 2.0 [シングルログアウト](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html#5.3.Single%20Logout%20Profile|outline) (SLO) をサポートしています。SLO を使用すると、アプリケーションはユーザープールからサインアウトするときに、SAML ID プロバイダー (IdP) からユーザーをサインアウトできます。これにより、ユーザーがアプリケーションに再度サインインする場合は、SAML IdP で認証する必要があります。そうしない場合は、認証情報を提供する要件なくアプリケーションに渡す、IdP またはユーザープールブラウザの Cookie が設置される可能性があります。

**サインアウトフロー**をサポートするように SAML IdP を設定すると、Amazon Cognito は、署名付き SAML ログアウトリクエストを使用してユーザーを IdP にリダイレクトします。Amazon Cognito は、IdP メタデータの `SingleLogoutService` URL からリダイレクト場所を決定します。Amazon Cognito は、ユーザープール署名証明書を使用してサインアウトリクエストに署名します。

![\[Amazon Cognito SAML サインアウトの認証フロー図。ユーザーはサインアウトをリクエストし、Amazon Cognito は SAML サインアウトリクエストを使用してプロバイダーにリダイレクトします。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-authentication-saml-sign-out.png)


SAML セッションを持つユーザーをユーザープール `/logout` エンドポイントに誘導すると、Amazon Cognito は、次のリクエストで、IdP メタデータで指定された SLO エンドポイントに SAML ユーザーをリダイレクトします。

```
https://[SingleLogoutService endpoint]?
SAMLRequest=[encoded SAML request]&
RelayState=[RelayState]&
SigAlg=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256&
Signature=[User pool RSA signature]
```

その後、ユーザーは IdP から `LogoutResponse` を使用して `saml2/logout` エンドポイントに戻ります。IdP は `HTTP POST` リクエストで `LogoutResponse` を送信する必要があります。その後、Amazon Cognito は、最初のサインアウトリクエストからリダイレクト先にリダイレクトします。

SAML プロバイダーは、複数の `AuthnStatement` を含む `LogoutResponse` を送信する場合があります。このタイプのレスポンスの最初の `AuthnStatement` の `sessionIndex` は、最初にユーザーを認証した SAML レスポンスの `sessionIndex` と一致する必要があります。`sessionIndex` が他の `AuthnStatement` にある場合、Amazon Cognito はセッションを認識せず、ユーザーはサインアウトされません。

------
#### [ AWS マネジメントコンソール ]

**SAML サインアウトを設定するには**

1. [ユーザープール](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[アプリケーションクライアント](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)、および SAML IdP を作成します。

1. SAML ID プロバイダーを作成または編集するときは、**[ID プロバイダーに関する情報]** で、**[サインアウトフローを追加]** というタイトルのチェックボックスをオンにします。

1. ユーザープールの **[ソーシャルプロバイダーと外部プロバイダー]** メニューで IdP を選択し、**[署名証明書]** を見つけます。

1. **[.crt としてダウンロード]** を選択します。

1. SAML シングルログアウトをサポートし、署名をサポートするように SAML プロバイダーを設定し、ユーザープール署名証明書をアップロードします。IdP は、ユーザープールドメインの `/saml2/logout` にリダイレクトする必要があります。

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

**SAML サインアウトを設定するには**

[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) API リクエストまたは [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API リクエストの `IDPSignout` パラメータを使用してシングルログアウトを設定します。以下は、SAML シングルログアウトをサポートする IdP の `ProviderDetails` の例です。

```
"ProviderDetails": { 
      "MetadataURL" : "https://myidp.example.com/saml/metadata",
      "IDPSignout" : "true",,
      "RequestSigningAlgorithm" : "rsa-sha256",
      "EncryptedResponses" : "true",
      "IDPInit" : "true"
}
```

------

# SAML 署名と暗号化
<a name="cognito-user-pools-SAML-signing-encryption"></a>

SAML 2.0 サインインは、認証フローのリクエストとレスポンスのベアラーとしてアプリケーションのユーザーを中心に構築されています。転送中にこれらの SAML ドキュメントについてユーザーによる読み取りや変更ができないようにしておきたい場合があります。これを実現するには、ユーザープールの SAML ID プロバイダー (IdP) に SAML 署名と暗号化を追加します。SAML 署名を使用すると、ユーザープールは SAML のサインインリクエストとサインアウトリクエストに署名を追加します。ユーザープールのパブリックキーを使用すると、IdP は、変更されていない SAML リクエストを受信していることを検証できます。次に、IdP が応答し、ユーザーのブラウザセッションに SAML アサーションを渡すと、IdP はそのレスポンスを暗号化して、ユーザーが独自の属性と権限を検査できないようにします。

SAML 署名と暗号化では、ユーザープール SAML オペレーション中のすべての暗号化オペレーションは、Amazon Cognito が生成するユーザープール提供のキーを使用して署名と暗号文を生成する必要があります。現在、外部キーを使用してリクエストに署名することや、暗号化されたアサーションを受け入れるようにユーザープールを設定することはできなくなっています。

**注記**  
ユーザープール証明書は 10 年間有効です。年に 1 回、Amazon Cognito はユーザープールの新しい署名証明書と暗号化証明書を生成します。Amazon Cognito は、署名証明書をリクエストするときに最新の証明書を返し、最新の署名証明書を使用してリクエストに署名します。IdP は、有効期限が切れていないユーザープール暗号化証明書を使用して SAML アサーションを暗号化できます。以前の証明書は、その有効期間の全期間にわたって引き続き有効であり、パブリックキーは、新旧の証明書で変更ありません。ベストプラクティスとしては、プロバイダー設定で証明書を毎年更新します。

**Topics**
+ [IdP からの暗号化された SAML レスポンスの受け入れ](#cognito-user-pools-SAML-encryption)
+ [SAML リクエストへの署名](#cognito-user-pools-SAML-signing)

## IdP からの暗号化された SAML レスポンスの受け入れ
<a name="cognito-user-pools-SAML-encryption"></a>

Amazon Cognito と IdP は、ユーザーによるサインインとサインアウトの際に、SAML レスポンスで機密性を確立できます。Amazon Cognito は、パブリック/プライベート RSA キーペアと証明書を、ユーザープールで設定した各外部 SAML プロバイダーに割り当てます。ユーザープール SAML プロバイダーのレスポンス暗号化を有効にする場合は、暗号化された SAML レスポンスをサポートする IdP に証明書をアップロードする必要があります。提供されたキーで IdP がすべての SAML アサーションの暗号化を開始する前は、SAML IdP へのユーザープール接続は機能しません。

以下は、暗号化された SAML サインインのフローの概要です。

1. ユーザーがサインインを開始し、SAML IdP を選択します。

1. ユーザープール [認可エンドポイント](authorization-endpoint.md) は、SAML サインインリクエストを使用してユーザーを SAML IdP にリダイレクトします。ユーザープールは、オプションとして、IdP による整合性の検証を可能にする署名に、このリクエストを添付できます。SAML リクエストに署名する場合は、署名証明書のパブリックキーを使用してユーザープールが署名したリクエストを受け入れるように IdP を設定する必要があります。

1. SAML IdP はユーザーに署名し、SAML レスポンスを生成します。IdP はパブリックキーでレスポンスを暗号化し、ユーザーをユーザープール `/saml2/idpresponse` エンドポイントにリダイレクトします。IdP は、SAML 2.0 仕様で定義されているようにレスポンスを暗号化する必要があります。詳細については、「[Assertions and Protocols for the OASIS Security Assertion Markup Language (SAML) V2.0](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf)」の「`Element <EncryptedAssertion>`」を参照してください。

1. ユーザープールは、SAML レスポンスの暗号文をプライベートキーで復号し、ユーザーに署名します。

**重要**  
ユーザープールで SAML IdP のレスポンス暗号化を有効にする場合、IdP は、プロバイダーに固有のパブリックキーを使用してすべてのレスポンスを暗号化する必要があります。Amazon Cognito は、暗号化をサポートするように設定した SAML 外部 IdP から、暗号化されていない SAML レスポンスを受け入れません。

ユーザープール内の外部 SAML IdP はレスポンス暗号化をサポートでき、各 IdP は独自のキーペアを受け取ります。

------
#### [ AWS マネジメントコンソール ]

**SAML レスポンスの暗号化を設定するには**

1. [ユーザープール](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[アプリケーションクライアント](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)、および SAML IdP を作成します。

1. SAML ID プロバイダーの作成または編集を行うときは、**[リクエストへの署名とレスポンスの暗号化]** で、**[暗号化された SAML アサーションをこのプロバイダーに要求]** というタイトルのチェックボックスをオンにします。

1. ユーザープールの **[ソーシャルプロバイダーと外部プロバイダー]** メニューで SAML IdP を選択し、**[暗号化証明書を表示]** を選択します。

1. **[.crt としてダウンロード]** を選択し、ダウンロードしたファイルを SAML IdP に提供します。証明書内のキーを使用して SAML レスポンスを暗号化するように SAML IdP を設定します。

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

**SAML レスポンスの暗号化を設定するには**

[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) API リクエストまたは [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API リクエストの `EncryptedResponses` パラメータを使用してレスポンス暗号化を設定します。以下は、リクエスト署名をサポートする IdP の `ProviderDetails` の例です。

```
"ProviderDetails": { 
      "MetadataURL" : "https://myidp.example.com/saml/metadata",
      "IDPSignout" : "true",
      "RequestSigningAlgorithm" : "rsa-sha256",
      "EncryptedResponses" : "true",
      "IDPInit" : "true"
}
```

ユーザープールから暗号化証明書を取得するには、[DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html) API リクエストを行い、レスポンスパラメータ `ProviderDetails` の `ActiveEncryptionCertificate` 値を取得します。この証明書を保存し、ユーザープールからのサインインリクエストの暗号化証明書として、この証明書を IdP に提供します。

------

## SAML リクエストへの署名
<a name="cognito-user-pools-SAML-signing"></a>

IdP への SAML 2.0 リクエストの整合性を証明できる機能は、Amazon Cognito の SP が開始した SAML サインインのセキュリティ上のメリットです。ドメインを持つ各ユーザープールは、ユーザープール X.509 署名証明書を受け取ります。この証明書内のパブリックキーを使用すると、ユーザープールは、ユーザーが SAML IdP を選択したときにユーザープールが生成する*サインアウトリクエスト*に暗号化署名を適用します。オプションで、SAML *サインインリクエスト*に署名するようにアプリケーションクライアントを設定できます。SAML リクエストに署名すると、IdP は、リクエストの XML メタデータの署名が、指定したユーザープール証明書のパブリックキーと一致することを確認できます。

------
#### [ AWS マネジメントコンソール ]

**SAML リクエストの署名を設定するには**

1. [ユーザープール](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[アプリケーションクライアント](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)、および SAML IdP を作成します。

1. SAML ID プロバイダーの作成または編集を行うときは、**[リクエストへの署名とレスポンスの暗号化]** で、**[このプロバイダーへの SAML リクエストに署名する]** というタイトルのチェックボックスをオンにします。

1. ユーザープールの **[ソーシャルプロバイダーと外部プロバイダー]** メニューで、**[署名証明書を表示]** を選択します。

1. **[.crt としてダウンロード]** を選択し、ダウンロードしたファイルを SAML IdP に提供します。受信 SAML リクエストの署名を検証するように SAML IdP を設定します。

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

**SAML リクエストの署名を設定するには**

[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) API リクエストまたは [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API リクエストの `RequestSigningAlgorithm` パラメータを使用してリクエスト署名を設定します。以下は、リクエスト署名をサポートする IdP の `ProviderDetails` の例です。

```
"ProviderDetails": { 
      "MetadataURL" : "https://myidp.example.com/saml/metadata",
      "IDPSignout" : "true",
      "RequestSigningAlgorithm" : "rsa-sha256",
      "EncryptedResponses" : "true",
      "IDPInit" : "true"
}
```

------

# SAML ID プロバイダーの名前と識別子
<a name="cognito-user-pools-managing-saml-idp-naming"></a>

SAML ID プロバイダー (IdP) に名前を付け、IdP 識別子を割り当てると、そのプロバイダーへの、SP が開始したサインインリクエストとサインアウトリクエストのフローを自動化できます。プロバイダーの名前に対する文字列制約の詳細については、[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html#CognitoUserPools-CreateIdentityProvider-request-ProviderName) の `ProviderName` プロパティを参照してください。

![\[IdP の識別子とマネージドログインを使用して Amazon Cognito の SP が開始した SAML サインインの認証フロー図。ユーザーは、マネージドログインに E メールアドレスを提供し、Amazon Cognito は、ユーザーを自動的にプロバイダーにリダイレクトします。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-authentication-saml-identifier.png)


SAML プロバイダーの識別子を 50 個まで選択することもできます。識別子は、ユーザープール内の IdP のわかりやすい名前であり、ユーザープール内で一意である必要があります。SAML 識別子がユーザーの E メールドメインと一致すると、マネージドログインは、各ユーザーの E メールアドレスをリクエストし、E メールアドレス内のドメインを評価して、ドメインに対応する IdP にユーザーをリダイレクトします。同じ組織で複数のドメインを所有することができるため、1 つの IdP が複数の識別子を持つことができます。

E メールドメイン識別子の使用の有無にかかわらず、マルチテナントアプリケーションの識別子を使用して、ユーザーを正しい IdP にリダイレクトできます。マネージドログインを完全にバイパスする場合は、ユーザーに提示するリンクをカスタマイズすることで、[認可エンドポイント](authorization-endpoint.md) を介してユーザーを IdP に直接リダイレクトできます。識別子を使用してユーザーにサインインし、IdP にリダイレクトするには、最初の認可リクエストのリクエストパラメータに `idp_identifier=myidp.example.com` 形式の識別子を含めます。

ユーザーを IdP に渡す別の方法は、IdP の名前を持つパラメータ `identity_provider` を、次の URL 形式で入力することです。

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

ユーザーが SAML IdP でサインインすると、IdP は、`HTTP POST` 本文内の SAML レスポンスを使用して `/saml2/idpresponse` エンドポイントにリダイレクトします。Amazon Cognito は SAML アサーションを処理し、レスポンスのクレームが期待を満たしている場合、アプリケーションクライアントのコールバック URL にリダイレクトします。ユーザーがこの方法で認証を完了すれば、ユーザーが IdP とアプリケーションのためにのみウェブページを操作したことになります。

ドメイン形式の IdP 識別子を使用すると、マネージドログインは、サインイン時に E メールアドレスをリクエストし、E メールドメインが IdP 識別子と一致すると、ユーザーを IdP のサインインページにリダイレクトします。例えば、異なる 2 つの会社に所属する従業員によるサインインが必要となるアプリケーションを構築するとします。最初の会社、AnyCompany A は、`exampleA.com` および `exampleA.co.uk` を所有しています。2 番目の会社、AnyCompany B は、`exampleB.com` を所有しています。この例では、以下のように、1 社ごとに 2 つの IdP を設定します。
+ IdP A では、識別子 `exampleA.com` および `exampleA.co.uk` を定義します。
+ IdP B では、識別子 `exampleB.com` を定義します。

アプリケーションでは、アプリケーションクライアントのマネージドログインを呼び出し、各ユーザーに E メールアドレスの入力を求めます。Amazon Cognito は、E メールアドレスからドメインを取得し、ドメインを IdP とドメイン識別子に関連付け、`idp_identifier` リクエストパラメータを含む [認可エンドポイント](authorization-endpoint.md) へのリクエストを使用して、ユーザーを正しい IdP にリダイレクトします。例えば、ユーザーが `bob@exampleA.co.uk` を入力した場合、ユーザーが操作する次のページは、`https://auth.exampleA.co.uk/sso/saml` の IdP サインインページになります。

また、同じロジックを個別に実装することもできます。アプリケーションでは、ユーザー入力を収集したうえで独自のロジックに従って正しい IdP に関連付けるカスタムフォームを構築できます。アプリケーションテナントごとにカスタムポータルを生成すると、リクエストパラメータ内のテナントの識別子を使用して、各アプリケーションテナントを承認エンドポイントにリンクできます。

E メールアドレスを収集して、マネージドログインのドメインを解析するには、アプリケーションクライアントに割り当てた SAML IdP ごとに 1 つ以上の識別子を割り当てます。デフォルトでは、マネージドログインのサインイン画面に、アプリケーションクライアントに割り当てた IdP ごとにボタンが表示されます。ただし、識別子を正常に割り当てると、クラシックのホストされた UI のサインインページは、次の画像のようになります。

![\[Amazon Cognito のマネージドログインのサインインページに表示される、ローカルユーザーのサインインと、フェデレーションユーザーに E メールアドレスの入力を求めるプロンプト。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/cup-saml-identifiers.png)


**注記**  
クラシックのホストされた UI では、IdP に識別子を割り当てると、アプリケーションクライアントのサインインページで自動的にメールアドレスの入力を求められます。マネージドログインのエクスペリエンスでは、この動作をブランディングエディタで有効にする必要があります。**[認証動作]** の設定カテゴリで、見出しの **[プロバイダーの表示]** の下にある **[ドメイン検索入力]** を選択します。

マネージドログインのドメイン解析では、ドメインを IdP 識別子として使用する必要があります。アプリケーションクライアントの SAML IdP ごとに任意のタイプの識別子を割り当てると、そのアプリケーションのマネージドログインには、IdP の選択ボタンが表示されなくなります。E メール解析やカスタムロジックを使用してリダイレクトを生成する場合は、SAML の IdP 識別子を追加します。サイレントリダイレクトを生成するとともに、マネージドログインに IdP のリストを表示する場合は、識別子を割り当てず、認可リクエストで `identity_provider` リクエストパラメータを使用します。
+ アプリケーションクライアントに SAML IdP を 1 つだけ割り当てると、マネージドログインのサインインページには、その IdP でサインインするためのボタンが表示されます。
+ アプリケーションクライアントでアクティブ化する SAML IdP ごとに識別子を割り当てると、マネージドログインサインインページには、E メールアドレスの入力をユーザーに求めるプロンプトが表示されます。
+ 複数の IdP があり、すべてには識別子を割り当てない場合、マネージドログインのサインインページには、割り当てた IdP ごとにサインインするためのボタンが表示されます。
+ IdP に識別子を割り当て、マネージドログインページに特定の IdP ボタンを表示する場合は、新しい IdP を識別子なしでアプリケーションクライアントに追加するか、新しいアプリケーションクライアントを作成します。既存の IdP を削除し、識別子を用いずにそれを再度追加することもできます。新しい IdP を作成すると、SAML ユーザーが新しいユーザープロファイルを作成します。このようにアクティブなユーザーが重複していると、IdP 設定を変更した月に請求に影響する可能性があります。

IdP セットアップの詳細については、「[ユーザープールの ID プロバイダーの設定](cognito-user-pools-identity-provider.md)」を参照してください。

# ユーザープールでの 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` レスポンスをチェックします。ユーザープールは、マッピングルールに一致するすべてのクレームをユーザープールのユーザープロファイルのユーザー属性に書き込みます。ユーザープールは、マッピングルールに一致するが必須ではなく、プロバイダーのクレームにも含まれていない属性を無視します。

# IdP 属性をプロファイルとトークンにマッピングする
<a name="cognito-user-pools-specifying-attribute-mapping"></a>

Amazon Cognito を含む ID プロバイダー (IdP) サービスは、通常、ユーザーに関する詳細情報を記録できます。ユーザーの勤務先の会社、連絡方法、その他の識別情報を把握しておきたい場合があります。しかしながら、これらの属性の形式はプロバイダーによって違いがあります。例えば、ユーザープールを使用して 3 つの異なるベンダーから 3 つの IdP をセットアップし、各ベンダーの SAML アサーション、ID トークン、`userInfo` ペイロードの例を調べるとします。ユーザーの E メールアドレスの表記は、ある IdP では `email`、別の IdP では `emailaddress`、もう 1 つの IdP では `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress` となります。

IdP ユーザープールと統合することで得られる主なメリットは、さまざまな属性名を、一貫性のある予測可能な共有属性名を持つ単一の OIDC トークンスキーマにマッピングできることです。これにより、デベロッパーは複雑なさまざまなシングルサインオンイベントを処理するためのロジックを維持する必要がなくなります。こうした形式の統合が属性マッピングです。ユーザープール属性マッピングは、IdP 属性名を、対応するユーザープール属性名に割り当てます。例えば、`emailaddress` クレームの値を標準ユーザープール属性 `email` に書き込むようにユーザープールを設定できます。

各ユーザープール IdP には、個別の属性マッピングスキーマがあります。IdP の属性マッピングを指定するには、Amazon Cognito コンソール、 AWS SDK、またはユーザープール REST API でユーザープール ID プロバイダーを設定します。

## マッピングについて知っておくべきこと
<a name="cognito-user-pools-specifying-attribute-mapping-requirements"></a>

ユーザー属性マッピングの設定を開始する前に、以下の重要な詳細事項を確認します。
+ フェデレーションユーザーがアプリケーションにサインインする際、マッピングは、ユーザープールが必要とする各ユーザープール属性に存在している必要があります。例えば、サインアップするためにユーザープールで `email` 属性が必要となる場合には、この属性を IdP から該当するものにマッピングします。
+ デフォルトで、マップされた E メールアドレスは未検証です。ワンタイムコードを使用してマップされた E メールアドレスを検証することはできません。その代わりに IdP からの属性をマップして、検証ステータスを取得します。例えば、Google とほとんどの OIDC プロバイダーには `email_verified` 属性が含まれています。
+ ID プロバイダー (IdP) のトークンをユーザープールのカスタム属性にマッピングできます。ソーシャルプロバイダーはアクセストークンを提示し、OIDC プロバイダーはアクセストークンと ID トークンを提示します。トークンをマッピングするには、最大長さ 2,048 文字のカスタム属性を追加し、アプリクライアントにその属性への書き込みアクセス許可を付与し、IdP からの `access_token` または `id_token` をカスタム属性にマッピングします。
+ マッピングされた各ユーザープールの属性では、値の最大長 さである 2048 文字が、Amazon Cognito が IdP から取得する値に対して十分な長さである必要があります。そうではない場合は、ユーザーがアプリケーションにサインインするときに Amazon Cognito がエラーを報告します。Amazon Cognito は、トークンの長さが 2,048 文字を超える場合、IdP トークンのカスタム属性へのマッピングをサポートしていません。
+ Amazon Cognito は、フェデレーション IdP がパスする特定のクレームから、フェデレーションユーザーのプロファイル内の `username` 属性を、次の表に示すように派生します。Amazon Cognito は、この属性値の先頭に、`MyOIDCIdP_[sub]` などの IdP の名前を追加します。フェデレーションユーザーについて、外部ユーザーディレクトリ内の属性と完全に一致する属性を持たせる場合は、その属性を `preferred_username` などの Amazon Cognito サインイン属性にマッピングします。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-specifying-attribute-mapping.html)
+ ユーザープールが[大文字と小文字を区別しない](user-pool-case-sensitivity.md)ものである場合、Amazon Cognito は、フェデレーションユーザーの自動生成されたユーザー名におけるユーザー名ソース属性を小文字に変換します。大文字と小文字を区別するユーザープールのユーザー名の例は次のとおりです: `MySAML_TestUser@example.com`。大文字と小文字を*区別しない*ユーザープールでは同じユーザー名が次のようになります: `MySAML_testuser@example.com`。

  大文字と小文字を区別しないユーザープールでは、ユーザー名を処理する Lambda トリガーは、ユーザー名ソース属性について大文字と小文字が混在するクレームに対して、この変更を考慮する必要があります。IdP を、現在のユーザープールとは異なる大文字と小文字の区別設定を持つユーザープールにリンクするには、新しいユーザープールを作成します。
+ Amazon Cognito は、ユーザーがアプリケーションにサインインするときにマップされたユーザープール属性を更新できる必要があります。ユーザーが IdP 経由でサインインすると、Amazon Cognito は IdP からの最新情報でマップされた属性を更新します。Amazon Cognito は、値が変更された場合にのみマッピングされた属性を更新します。Amazon Cognito が属性を更新できることを確実にするため、以下の要件をチェックしてください。
  + IdP からマッピングするユーザープールのカスタム属性は、すべて*変更可能*である必要があります。変更可能なカスタム属性はいつでも更新できます。一方、ユーザーの*イミュータブル* (変更不可) カスタム属性は、ユーザープロファイルの初回作成時を除き、値を設定できません。Amazon Cognito コンソールで変更可能なカスタム属性を作成するには、**[サインアップエクスペリエンス]** メニューの **[カスタム属性を追加]** を選択して追加した属性の **[変更可能]** チェックボックスをオンにします。または、[CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) API オペレーションを使用してユーザープールを作成した場合、これらの各属性の `Mutable` パラメータを `true` に設定できます。IdP が、マッピングされたイミュータブルな属性の値を送信すると、Amazon Cognito はエラーを返し、サインインは失敗します。
  + アプリケーションのアプリクライアントの設定では、マッピングされた属性を*書き込み可能*にする必要があります。書き込み可能な属性は、Amazon Cognito コンソールの **[App clients]** (アプリクライアント) ページで設定できます。また、[https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) API を使用してアプリクライアントを作成する場合、これらの属性を `WriteAttributes` 配列に追加できます。IdP が、マッピングされた書き込み不可の属性の値を送信する場合、Amazon Cognito は属性値を設定せず、認証に進みます。
+ IdP 属性に複数の値が含まれている場合、Amazon Cognito はすべての値を角括弧文字 `[` および `]` で囲まれた 1 つのカンマ区切り文字列にフラット化します。Amazon Cognito は、`.`、`-`、`*`、`_` を除く、英数字以外の文字を含む値を URL フォームエンコードします。値は、アプリでの使用前にデコードおよび解析しておく必要があります。
+ 送信先属性は、サインインまたは管理アクションによって変更されない限り、属性マッピングルールによって割り当てられた値を保持します。プロバイダートークンまたは SAML アサーションでソース属性が送信されなくなった場合でも、Amazon Cognito はユーザーから属性を削除しません。以下のアクションでは、フェデレーションユーザーのユーザープールプロファイルから属性の値を削除します。

  1. IdP はソース属性に空白の値を送信し、マッピングルールによって空白の値を送信先属性に適用します。

  1. [DeleteUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserAttributes.html) リクエストまたは [AdminDeleteUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDeleteUserAttributes.html) リクエストを使用して、マッピングされた属性の値をクリアします。

## ユーザープールの ID プロバイダー属性マッピングを指定する (AWS マネジメントコンソール)
<a name="cognito-user-pools-specifying-attribute-mapping-console"></a>

を使用して AWS マネジメントコンソール 、ユーザープールの IdP の属性マッピングを指定できます。

**注記**  
Amazon Cognito は、着信トークンに着信クレームが存在する場合に限り、そのクレームをユーザープール属性にマップします。以前にマッピングされたクレームが着信トークンに存在しなくなった場合、そのクレームは削除または変更されません。削除されたクレームのマッピングがアプリケーションで必要な場合は、事前認証 Lambda トリガーを使用して認証中にカスタム属性を削除し、それらの属性を着信トークンから再入力できます。

**ソーシャル IdP 属性マッピングを指定するには**

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

1. ナビゲーションペインで **[User Pools]** (ユーザープール) を選択してから、編集するユーザープールを選択します。

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

1. **[ID プロバイダーを追加]** を選択するか、設定した **[Facebook]**、**[Google]**、**[Amazon]**、または **[Apple]** の IdP を選択します。**[Attribute mapping]** (属性マッピング) を検索し、 **[Edit]** (編集) を選択します。

   ソーシャル IdP の追加の詳細については、「[ユーザープールによるソーシャル ID プロバイダーの使用](cognito-user-pools-social-idp.md)」を参照してください。

1. マッピングする必要のある各属性について、以下のステップを完了してください。

   1. **[User pool attribute]** (ユーザープール属性) 列から属性を選択します。これは、ユーザープール内のユーザープロファイルに割り当てられる属性です。カスタム属性は、標準属性の後にリストされます。

   1. **[*<provider>* attribute]** (<プロバイダー> 属性) 列から属性を選択します。これは、プロバイダーディレクトリから渡される属性になります。ソーシャルプロバイダーの既知の属性は、ドロップダウンリストに表示されます。

   1. IdP と Amazon Cognito の間に追加の属性をマッピングするには、**[Add another attribute]** (その他の属性を追加) を選択します。

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

**SAML プロバイダー属性マッピングを指定する**

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

1. ナビゲーションペインで **[User Pools]** (ユーザープール) を選択してから、編集するユーザープールを選択します。

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

1. **[Add an identity provider]** (ID プロバイダーの追加) を選択するか、設定した SAML IdP を選択します。**[Attribute mapping]** (属性マッピング) を探し、**[Edit]** (編集) を選択します。SAML IdP の詳細については、「[ユーザープールによる SAML ID プロバイダーの使用](cognito-user-pools-saml-idp.md)」を参照してください。

1. マッピングする必要のある各属性について、以下のステップを完了してください。

   1. **[User pool attribute]** (ユーザープール属性) 列から属性を選択します。これは、ユーザープール内のユーザープロファイルに割り当てられる属性です。カスタム属性は、標準属性の後にリストされます。

   1. **[SAML attribute]** (SAML 属性) 列から属性を選択します。これは、プロバイダーディレクトリから渡される属性になります。

      IdP は、参考として SAML アサーションのサンプルを提供する場合があります。IdP の中には、`email` などの単純な名前を使用するものもあれば、次のような URL 形式の属性名を使用するものもあります。

      ```
      http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
      ```

   1. IdP と Amazon Cognito の間に追加の属性をマッピングするには、**[Add another attribute]** (その他の属性を追加) を選択します。

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

## ユーザープール (AWS CLI および AWS API) の ID プロバイダー属性マッピングの指定
<a name="cognito-user-pools-specifying-attribute-mapping-cli-api"></a>

次の [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) または [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) のリクエスト本文は、SAML プロバイダーの「MyIdP」属性 `emailaddress`、`birthdate`、`phone` を、ユーザープール属性 `email`、`birthdate`、`phone_number` に (この順序で) マッピングします。これは SAML 2.0 プロバイダーの完全なリクエスト本文です。リクエスト本文は IdP タイプと特定の詳細によって異なります。属性マッピングは `AttributeMapping` パラメータにあります。

```
{
   "AttributeMapping": { 
      "email" : "emailaddress",
      "birthdate" : "birthdate",
      "phone_number" : "phone"
   },
   "IdpIdentifiers": [ 
      "IdP1",
      "pdxsaml"
   ],
   "ProviderDetails": { 
      "IDPInit": "true", 
      "IDPSignout": "true", 
      "EncryptedResponses" : "true", 
      "MetadataURL": "https://auth.example.com/sso/saml/metadata", 
      "RequestSigningAlgorithm": "rsa-sha256"
   },
   "ProviderName": "MyIdP",
   "ProviderType": "SAML",
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

以下のコマンドを使用して、ユーザープールの IdP 属性マッピングを指定します。

**プロバイダーの作成時に属性マッピングを指定する**
+ AWS CLI: `aws cognito-idp create-identity-provider`

  メタデータファイルの例: `aws cognito-idp create-identity-provider --user-pool-id <user_pool_id> --provider-name=SAML_provider_1 --provider-type SAML --provider-details file:///details.json --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`

  ここでは `details.json` に以下が含まれます。

  ```
  { 
      "MetadataFile": "<SAML metadata XML>"
  }
  ```
**注記**  
*<SAML メタデータ XML>* に引用符が (`"`) 含まれる場合は、エスケープ (`\"`) する必要があります。

  メタデータ URL の例:

  ```
  aws cognito-idp create-identity-provider \
  --user-pool-id us-east-1_EXAMPLE \
  --provider-name=SAML_provider_1 \
  --provider-type SAML \
  --provider-details MetadataURL=https://myidp.example.com/saml/metadata \
  --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
  ```
+ API/SDK: [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html)

**既存の IdP の属性マッピングを指定するには**
+ AWS CLI: `aws cognito-idp update-identity-provider`

  例: `aws cognito-idp update-identity-provider --user-pool-id <user_pool_id> --provider-name <provider_name> --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`
+ API/SDK: [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html)

**特定の IdP の属性マッピングに関する情報を取得するには**
+ AWS CLI: `aws cognito-idp describe-identity-provider`

  例: `aws cognito-idp describe-identity-provider --user-pool-id <user_pool_id> --provider-name <provider_name>`
+ API/SDK: [DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html)

# フェデレーションユーザーを既存のユーザープロファイルにリンクする
<a name="cognito-user-pools-identity-federation-consolidate-users"></a>

多くの場合、同じユーザーが、ユーザープールに接続している複数の ID プロバイダー (IdP) にプロファイルを持っています。Amazon Cognito では、ユーザーが出現するたびにディレクトリ内の同じユーザープロファイルにリンクできます。このようにして、複数の IdP ユーザーを持つ 1 人のユーザーが、アプリで一貫したエクスペリエンスを持つことができます。[AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html) は、フェデレーションディレクトリ内のユーザーの一意の ID をユーザープール内のユーザーとして認識するように Amazon Cognito に指示します。ユーザープール内のユーザーは、ユーザープロファイルに関連付けられているフェデレーション ID が 0 個以上ある場合、[課金](https://aws.amazon.com/cognito/pricing/)の目的で 1 人の月間アクティブユーザー (MAU) としてカウントされます。

フェデレーションユーザーが初めてユーザープールにサインインすると、Amazon Cognito はその ID にリンクされたローカルプロファイルを探します。リンクされたプロファイルが存在しない場合、ユーザープールは新しいプロファイルを作成します。ローカルプロファイルを作成して、`AdminLinkProviderForUser` API リクエストで、計画されたプリステージタスクまたは [サインアップ前の Lambda トリガー](user-pool-lambda-pre-sign-up.md) のいずれかで初めてサインインする前に、フェデレーションユーザーにいつでもリンクできます。ユーザーがサインインし、Amazon Cognito がリンクされたローカルプロファイルを検出すると、ユーザープールはユーザーのクレームを読み取り、IdP のマッピングルールと比較します。次に、ユーザープールは、ログイン時にマッピングされたクレームを反映して、リンクされたローカルプロファイルを更新します。これにより、アクセスクレームを使用してローカルプロファイルを設定し、ID クレームをプロバイダーとの間で最新の状態に保つことができます。Amazon Cognito により、フェデレーションユーザーとリンクされたプロファイルがマッチングされると、フェデレーションユーザーは常にそのプロファイルにサインインします。次に、ユーザーの他のプロバイダー ID を同じプロファイルにリンクして、ユーザーのアプリエクスペリエンスを一貫させることができます。以前にサインインしたフェデレーションユーザーをリンクするには、まず既存のプロファイルを削除する必要があります。既存のプロファイルは、`[Provider name]_identifier` という形式で識別できます。例えば、`LoginWithAmazon_amzn1.account.AFAEXAMPLE`。ユーザーを作成してサードパーティーユーザー ID にリンクした場合、そのユーザーは、作成時につけられたユーザー名と、リンクされた ID の詳細を含む `identities` 属性を持つことになります。

**重要**  
`AdminLinkProviderForUser` は、外部フェデレーション ID を持つユーザーが、ユーザープール内の既存のユーザーとしてサインインすることを許可するため、アプリケーション所有者によって信頼されている外部 IdP およびプロバイダー属性でのみ使用されることが重要です。

例えば、複数のお客様と共有するアプリを使用するマネージドサービスプロバイダー (MSP) の場合です。お客様はそれぞれ、Active Directory Federation Services (ADFS) を使用してアプリにサインインします。IT 管理者 Carlos は、各お客様のドメインにアカウントを持っています。IdP に関係なく、Carlos がサインインするたびにアプリ管理者として認識されるようにします。

ADFS IdP は、Carlos の SAML アサーションの `email` クレームで Carlos の E メールアドレス `msp_carlos@example.com` を Amazon Cognito に提示します。ユーザー名 `Carlos` を使用してユーザープールにユーザーを作成します。以下の AWS Command Line Interface (AWS CLI) コマンドは、IdPs ADFS1、ADFS2、ADFS3 から Carlos の ID をリンクします。

**注記**  
特定の属性クレームに基づいてユーザーをリンクできます。この機能は OIDC と SAML IdP に固有のものです。他のプロバイダータイプでは、固定ソース属性に基づいてリンクする必要があります。詳細については、「[AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html)」を参照してください。ソーシャル IdP をユーザープロファイルにリンクするとき、`ProviderAttributeName` に `Cognito_Subject` を設定する必要があります。`ProviderAttributeValue` は、IdP のユーザーの一意の識別子でなければなりません。

```
aws cognito-idp admin-link-provider-for-user \
--user-pool-id us-east-1_EXAMPLE \
--destination-user ProviderAttributeValue=Carlos,ProviderName=Cognito \
--source-user ProviderName=ADFS1,ProviderAttributeName=email,ProviderAttributeValue=msp_carlos@example.com

aws cognito-idp admin-link-provider-for-user \
--user-pool-id us-east-1_EXAMPLE \
--destination-user ProviderAttributeValue=Carlos,ProviderName=Cognito \
--source-user ProviderName=ADFS2,ProviderAttributeName=email,ProviderAttributeValue=msp_carlos@example.com

aws cognito-idp admin-link-provider-for-user \
--user-pool-id us-east-1_EXAMPLE \
--destination-user ProviderAttributeValue=Carlos,ProviderName=Cognito \
--source-user ProviderName=ADFS3,ProviderAttributeName=email,ProviderAttributeValue=msp_carlos@example.com
```

ユーザープールのユーザープロファイル `Carlos` は、次の `identities` 属性を持つようになりました。

```
[{
    "userId": "msp_carlos@example.com",
    "providerName": "ADFS1",
    "providerType": "SAML",
    "issuer": "http://auth.example.com",
    "primary": false,
    "dateCreated": 111111111111111
}, {
    "userId": "msp_carlos@example.com",
    "providerName": "ADFS2",
    "providerType": "SAML",
    "issuer": "http://auth2.example.com",
    "primary": false,
    "dateCreated": 111111111111111
}, {
    "userId": "msp_carlos@example.com",
    "providerName": "ADFS3",
    "providerType": "SAML",
    "issuer": "http://auth3.example.com",
    "primary": false,
    "dateCreated": 111111111111111
}]
```

**フェデレーションユーザーのリンクについて知っておくべきこと**
+ 各ユーザープロファイルに最大 5 人のフェデレーションユーザーをリンクできます。
+ `AdminLinkProviderForUser` API リクエストにおける `SourceUser` の `ProviderAttributeName` パラメータで定義されているように、最大 5 つの IdP 属性クレームから各 IdP にユーザーをリンクできます。例えば、少なくとも 1 人のユーザーをソース属性 `email`、`phone`、`department`、`given_name`、`location` にリンクしている場合、これらの 5 つの属性のいずれかにおいてのみ追加ユーザーをリンクできます。
+ フェデレーションユーザーは、既存のフェデレーションユーザープロファイルまたはローカルユーザーにリンクできます。
+ のユーザープロファイルにプロバイダーをリンクすることはできません AWS マネジメントコンソール。
+ ユーザーの ID トークンには、`identities` クレームに関連するすべてのプロバイダーが含まれます。
+ [AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) API リクエストで、自動的に作成されたフェデレーションユーザープロファイルのパスワードを設定できます。その後、そのユーザーのステータスは `EXTERNAL_PROVIDER` から `CONFIRMED` に変わります。この状態のユーザーは、フェデレーションユーザーとしてサインインし、リンクされたローカルユーザーのように API で認証フローを開始できます。また、[ChangePassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ChangePassword.html) や [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) などのトークン認証された API リクエストでパスワードや属性を変更することもできます。セキュリティのベストプラクティスとして、またユーザーを外部 IdP と同期した状態を維持するため、フェデレーションユーザープロファイルにパスワードを設定しないでください。代わりに、`AdminLinkProviderForUser` でユーザーをローカルプロファイルにリンクしてください。
+ Amazon Cognito は、ユーザーが IdP からサインインするときに、リンクされたローカルユーザープロファイルにユーザー属性を入力します。Amazon Cognito は OIDC IdP からの ID トークン内のアイデンティティ要求を処理し、OAuth 2.0 プロバイダーと OIDC プロバイダー両方の `userInfo` エンドポイントもチェックします。Amazon Cognito では、ID トークン内の情報は `userInfo` からの情報よりも優先されます。

プロファイルにリンクした外部ユーザーアカウントをユーザーが使用しなくなった場合は、ユーザーアカウントとユーザープールユーザーとの関連付けを解除できます。ユーザーをリンクしたときに、ユーザーの属性名、属性値、プロバイダー名をリクエストに入力しました。ユーザーに不要となったプロファイルを削除するには、同じパラメータを指定して [AdminDisableProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDisableProviderForUser.html) API リクエストを行います。

 AWS SDK での追加のコマンド構文と例については、「[AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html)」を参照してください。