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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Web 联合身份验证

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

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

  • Login with Amazon

  • Facebook

  • Google

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

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

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

要显示如何将 Web 联合身份验证与 DynamoDB 结合使用,请重新访问中介绍的 GameScores使用 IAM 策略条件实现精细访问控制 表。以下是 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),从而在 GameRole 中提供 Login with Amazon 应用程序 ID 和请求成员资格。AWS STS 向应用程序返回临时 AWS 凭证,并允许应用程序访问 GameScores 表,具体取决于 GameRole 策略文档。

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

Web 联合身份验证概览

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

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

  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" } } } ] }

子句确定 ConditionGameScores 中的哪些项目对应用程序可见。它通过比较 Login with Amazon ID 与 UserId 中的 GameScores 分区键值来执行此操作。 只有属于当前用户的项目才能使用此策略中列出的 DynamoDB 操作之一进行处理。该表中的其他项目均不可访问 此外,只有策略中列示的特定属性方予访问。