

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

# 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)