

# 使用 Web 身份联合验证
<a name="WIF"></a>

如果您在为大量用户编写应用程序，可以选择使用 *Web 联合身份验证* 进行身份验证和授权。Web 联合身份验证使您无需创建单个 用户。相反，用户可以登录到身份提供程序，然后从 AWS Security Token Service (AWS STS) 获取临时安全凭证。然后，应用程序可以使用这些证书访问 AWS 服务。

Web 联合身份验证支持以下身份提供商：
+ 以 Login with Amazon 登录
+ Facebook
+ Google

## 有关 Web 联合身份验证的其他资源
<a name="WIF.AdditionalResources"></a>

以下资源可帮助您详细了解 Web 联合身份验证：
+ AWS 开发人员博客上的文章[使用适用于 适用于 .NET 的 AWS SDK 的 Web 联合身份验证](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)分步介绍了如何对 Facebook 使用 Web 联合身份验证。其中包含 C\$1 代码片段，这些代码片段展示如何使用 Web 身份代入 IAM 角色，以及如何使用临时安全凭证访问 AWS 资源。
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/)和[适用于 Android 的 AWS Mobile SDK](https://aws.amazon.com/sdkforandroid/)包含示例应用程序。这些应用程序中包括的代码演示了如何调用身份提供商，然后如何使用这些提供商提供的信息获得和使用临时安全凭证。
+ [移动应用程序的 Web 联合身份验证](https://aws.amazon.com/articles/4617974389850313)一文讨论 Web 联合身份验证，并给出一个示例，演示如何使用 Web 联合身份验证访问 AWS 资源。

## Web 身份联合验证的示例策略
<a name="WIF.Example"></a>

要显示如何将 Web 联合身份验证与 DynamoDB 结合使用，请重新访问[使用 IAM 策略条件进行精细访问控制](specifying-conditions.md)的 *GameScores* 表。以下是 *GameScores* 的主键：


****  

| 表名称 | 主键类型 | 分区键名称和类型 | 排序键名称和类型 | 
| --- | --- | --- | --- | 
| GameScores（UserId、GameTitle、...） | 复合键 | 属性名称：UserId 类型：字符串 | 属性名称：GameTitle 类型：字符串 | 

现在假设移动游戏应用程序使用该表，并且此应用程序需要支持数千甚至数百万用户。在这种规模下，在 *GameScores* 表中管理单个应用程序用户并保证每位用户只能访问他们自己的数据将变得十分困难。幸运的是，许多用户已有某个第三方身份提供商（如 Facebook、Google 或 Login with Amazon）的账户。因此，可以利用这些提供商之一执行身份验证任务。

使用 Web 联合身份验证执行此操作，应用程序开发人员必须向身份识别提供商注册此应用程序（如 Login with Amazon）并获取唯一应用程序 ID。然后，开发人员需要创建一个 IAM 角色。（对于本示例，此角色名为 *GameRole*。） 该角色必须有附加的 IAM 策略文档，指定应用程序可以访问 *GameScores* 表的条件。

当用户想要玩游戏时，他可从游戏应用程序登录其 Login with Amazon 账户。然后，应用程序调用 AWS Security Token Service（AWS STS）以提供 Login with Amazon 应用程序 ID 并请求 *GameRole* 中的成员身份。AWS STS 向应用程序返回临时 AWS 凭证，并支持其访问 *GameScores* 表（遵循 *GameRole* 策略文档）。

下图显示了这些部分是如何组合到一起的。

![\[游戏应用程序的工作流。该应用程序使用 Amazon ID 和 AWS STS 来获取用于访问 DynamoDB 表的临时凭证。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/wif-overview.png)


**Web 身份联合验证概述**

1. 应用程序调用第三方身份提供商对用户和应用程序进行身份验证。身份提供商会返回 Web 身份验证令牌到应用程序。

1. 应用程序调用 AWS STS 并将 Web 身份验证令牌作为输入传递。AWS STS 授权应用程序并授予其临时 AWS 访问凭证。应用程序可代入 IAM 角色 (*GameRole*) 并根据该角色的安全策略访问 AWS 资源。

1. 应用程序调用 DynamoDB 以访问 *GameScores* 表。因为应用程序已代入 *GameRole*，因此要受与该角色关联的安全策略的制约。策略文档可防止用户访问不属于自己的数据。

同样，这是 *GameRole* 的安全策略，显示在 [使用 IAM 策略条件进行精细访问控制](specifying-conditions.md)：

------
#### [ 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 操作处理。该表中的其他项目均不可访问 此外，只有策略中列示的特定属性方予访问。