

# ウェブ ID フェデレーションの使用
<a name="WIF"></a>

多数のユーザーを対象とするアプリケーションを記述している場合、必要に応じて、*ウェブ ID フェデレーション*を使用して、認証と認可を実行できます。ウェブ ID フェデレーションは、個々の ユーザーを作成する必要性を排除します。代わりに、ユーザーは ID プロバイダーにサインインした後、一時的なセキュリティ資格情報を AWS Security Token Service (AWS STS) から取得できます。アプリケーションでは、この認証情報を使用して AWS サービスにアクセスできます。

ウェブアイデンティティフェデレーションでは、次のアイデンティティプロバイダーをサポートしています。
+ Login with Amazon
+ Facebook
+ Google

## ウェブアイデンティティフェデレーションに関するその他のリソース
<a name="WIF.AdditionalResources"></a>

ウェブアイデンティティフェデレーションの詳細を理解するのに、次のリソースが役に立ちます。
+ AWS デベロッパーブログの「[Web Identity Federation using the AWS SDK for .NET](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net) 」の記事では、ウェブ ID フェデレーションを Facebookで使用する方法について説明しています。記事には、ウェブ ID を持つ ロールを想定する方法や、一時的なセキュリティ認証情報を使用して AWS リソースにアクセスする方法を示す C\$1 のコードスニペットが含まれています。
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) と [AWS Mobile SDK for Android](https://aws.amazon.com/sdkforandroid/) には、サンプルアプリが含まれています。このアプリケーションには、アイデンティティプロバイダーを呼び出す方法、そのプロバイダーからの情報を使用して、一時的なセキュリティ認証情報を取得および使用する方法を示すコードが含まれています。
+ 記事「[Web Identity Federation with Mobile Applications](https://aws.amazon.com/articles/4617974389850313)」では、ウェブ ID フェデレーションについて説明し、ウェブ ID フェデレーションを使用して AWS リソースにアクセスする使用方法の例を挙げています。

## ウェブ ID フェデレーションのポリシー例
<a name="WIF.Example"></a>

DynamoDB でウェブ ID フェデレーションを使用する方法を示すには、[詳細に設定されたアクセスコントロールのための IAM ポリシー条件の使用](specifying-conditions.md) で導入された *GameScores* テーブルに再度アクセスしてください。次に、*GameScores* のプライマリキーを示します。


****  

| テーブル名 | プライマリキーのタイプ | パーティションキーの名前と型 | ソートキーの名前と型 | 
| --- | --- | --- | --- | 
| GameScores (UserId、GameTitle、...) | 複合 | 属性名: UserId 型: 文字列 | 属性名: GameTitle 型: 文字列 | 

ここで、あるモバイルゲームアプリケーションがこのテーブルを使用し、そのアプリケーションでは、数千人、数百万人のユーザーをサポートする必要があるとします。この規模では、個別のアプリケーションユーザーを管理し、各ユーザーが *GameScores* テーブルの自分のデータにだけアクセスできることを確実にするのは非常に難しいです。多くのユーザーは、Facebook、Google、Login with Amazon などのサードパーティーの ID プロバイダーのアカウントを既に持っています。そのため、このようなプロバイダーのいずれかを利用して、認証タスクを行うことができます。

ウェブ ID フェデレーションを使用して認証を行うには、アプリケーションデベロッパーは、そのアプリケーションをアイデンティティプロバイダー（Login with Amazon など）に登録して、一意のアプリケーション ID を取得する必要があります。次に、デベロッパーはロールを作成する必要があります (この例では、このロールには *GameRole* という名前が付いています)。このロールには、IAM ポリシードキュメントを添付する必要があります。このドキュメントでは、アプリケーションが *GameScores* テーブルにアクセスできるように条件を指定します。

ユーザーは、ゲームをプレイするとき、ゲームアプリケーション内から Login with Amazon アカウントにサインインします。その後アプリケーションが AWS Security Token Service (AWS STS) を呼び出します。その際には Login with Amazon アプリ ID を指定し、*GameRole* でメンバーシップをリクエストします。AWS STS は一時的な AWS 認証情報をアプリケーションに返し、*GameRole* ポリシードキュメントに基づいて *GameScores* テーブルへのアクセスを許可します。

次の図は、これらの要素を組み合わせるとどのようになるかを示しています。

![\[ゲームアプリケーションのワークフロー。アプリは Amazon ID と AWS STS を使用して、DynamoDB テーブルにアクセスするための一時的な認証情報を取得します。\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/wif-overview.png)


**ウェブ ID フェデレーションの概要**

1. アプリケーションは、サードパーティのアイデンティティプロバイダーを呼び出して、ユーザーとアプリケーションを認証します。アイデンティティプロバイダーは、ウェブアイデンティティトークンをアプリケーションに返します。

1. アプリは AWS STS を呼び出し、ウェブアイデンティティトークンを入力として渡します。AWS STS は、アプリケーションを認可し、一時的な AWS アクセス認証情報をアプリケーションに渡します。アプリケーションは、IAM ロール (*GameRole*) を想定し、そのロールのセキュリティポリシーに従って AWS リソースにアクセスすることが許可されます。

1. アプリケーションは、DynamoDB をコールして、*GameScores* テーブルにアクセスします。アプリケーションは *GameRole* を想定しているので、そのロールに関連付けられたセキュリティポリシーの影響を受けます。ポリシードキュメントによって、ユーザーに属していないデータにアプリケーションはアクセスできません。

繰り返しになりますが、[詳細に設定されたアクセスコントロールのための IAM ポリシー条件の使用](specifying-conditions.md) に示されている *GameRole* のセキュリティポリシーは次のとおりです。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 節によって、アプリケーションに表示される *GameScores* の項目が決まります。Login with Amazon ID と `UserId` の `GameScores` パーティションキーの値を比較することで、これを行います。このポリシーに列挙されている DynamoDB アクションのいずれかを使用して処理できるのは、現在のユーザーに属する項目だけです。テーブルのその他の項目にはアクセスできません。さらに、ポリシーに列挙されている特定の属性にだけアクセスできます。