使用 Web 身份联合验证 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Web 身份联合验证

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

Web 联合身份验证支持以下身份提供商:

  • Login with Amazon

  • Facebook

  • Google

有关 Web 联合身份验证的其他资源

以下资源可帮助您详细了解 Web 联合身份验证:

Web 身份联合验证的示例策略

要显示如何将 Web 联合身份验证与 DynamoDB 结合使用,请重新访问使用 IAM 策略条件进行精细访问控制GameScores 表。以下是 GameScores 的主键:

表名称 主键类型 分区键名称和类型 排序键名称和类型
GameScores(UserIdGameTitle、...) 复合键 属性名称:UserId

类型:字符串
属性名称:GameTitle

类型:字符串

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

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

当用户想要玩游戏时,他可从游戏应用程序登录其 Login with Amazon 账户。应用程序会调用 Amazon Security Token Service (Amazon STS) 以提供 Login with Amazon 应用程序 ID 和请求的 GameRole 成员身份。Amazon STS 会返回临时 Amazon 凭证到应用程序并允许其访问 GameScores 表(遵循 GameRole 策略文档)。

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

游戏应用程序的工作流。该应用程序使用 Amazon ID 和 Amazon STS 来获取用于访问 DynamoDB 表的临时凭证。

Web 身份联合验证概述

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

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

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

同样,这是 GameRole 的安全策略,显示在 使用 IAM 策略条件进行精细访问控制

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