首页 > 解决方案 > 如何使用 S3 创建仅限会员的页面?

问题描述

我想使用 Cognito 和 S3 创建一个仅限会员的页面。我能够注册并使用 Cognito 登录,但我不知道只有登录用户才能访问的 S3 设置。我希望 S3 只能由在创建 Cognito 期间创建的经过身份验证的角色访问。我怎么做?

标签: amazon-web-servicesamazon-s3amazon-cognito

解决方案


要使用 IAM 角色控制访问,一种选择是在登录 Cognito 用户池并获取 JWT 令牌后使用 Cognito 身份池。

将 JWT 令牌呈现给身份池并获取与您在 Cognito 身份池中设置的 IAM 角色相关联的 AWS STS 令牌。

请参阅登录后使用身份池访问 AWS 服务

请注意用户池和身份池之间的区别,因为它们是不同的服务,但使用相同的名称“Cognito”,这可能会造成混淆。

用户池只是另一种身份验证服务,如 auth0、Google、Facebook。我们不会期望我们可以使用 Google 或 Auth0 在登录时提供的令牌来控制 AWS 资源访问。同样,我们无法使用登录用户池时用户池提供的令牌来控制对 AWS 资源的访问。

亚马逊文档在这一点上很模棱两可,经常在同一个文档中混淆用户池和身份池,造成混淆。

为了能够控制 AWS 资源访问,我们需要 IAM 角色和 AWS STS 令牌,这基本上与用户池本身无关(如谷歌、Auth0 等)。

我们需要一种将用户池令牌链接到 IAM 角色的机制。有几个选项。

  1. 使用 Cognito 身份池身份池正是为此目的提供的服务。

  2. 使用 Cognito 用户池组映射到 IAM 角色。

或者,我们可以使用 AWS javasdcript SDK,通过扮演角色直接获取 STS 令牌并使用它。

同样,请注意有关用户池和身份池的 Amazon 文档。就个人而言,他们不应该在同一个文档中混淆不同的服务。User Pool 只是另一个 Identity Token Provider 服务,如 Auth0,但 Identity Pool 是一种将外部令牌(如 Google、Auth0 或 Userpool)映射到 IAM 角色的服务。

如果坚持使用用户池 JWT 令牌,另一种选择可能是使用 API Gateway Cognito 用户池授权方。设置只有经过用户池身份验证的用户才能访问的 API 网关,并且 API 网关提供 S3 Web 内容。

ALB 还具有外部身份提供者身份验证选项。这可用于仅允许访问用户池身份验证的用户。


推荐阅读