Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

IAM 角色

在创建身份池的过程中,系统会提示您更新用户承担的 IAM 角色。IAM 角色的工作方式是这样的:当用户登录应用程序时,Amazon Cognito 为用户生成临时 AWS 凭证。这些临时凭证与特定 IAM 角色相关联。IAM 角色让您可以定义一组权限,用来访问您的 AWS 资源。

您可以为经过身份验证的用户和未经身份验证的用户指定默认 IAM 角色。此外,您可以定义规则,以便基于用户 ID 令牌中的声明为每个用户选择角色。有关更多信息,请参阅基于角色的访问控制

默认情况下,Amazon Cognito 控制台创建的 IAM 角色可提供对 Amazon Mobile Analytics 和 Amazon Cognito Sync 的访问权限。或者,您也可以选择使用现有的 IAM 角色。

要修改 IAM 角色,从而允许或禁止访问其他服务,请登录 IAM 控制台。然后,单击“Roles”,选择一个角色。“Permissions”选项卡中会列出选定角色所附加的策略。您可以单击相应的“Manage Policy”链接自定义访问策略。要了解如何使用和定义策略的更多信息,请参阅 IAM 策略概述

注意

作为最佳实践,定义策略时应遵循授予最低权限的原则。换言之,策略只包含用户执行其任务所需的权限。有关更多信息,请参阅 IAM 用户指南 中的授予最低权限

请记住,未经验证的身份会被未登录应用的用户所利用。通常情况下,为未经验证的身份分配的权限应该比为经过验证的身份分配的权限更严格。

设置信任策略

Amazon Cognito 利用 IAM 角色来为应用程序的用户生成临时凭证。对权限的访问由角色的信任关系控制。了解有关角色信任和权限的更多信息。

跨身份池重复使用角色

要跨多个身份池重复使用某个角色,由于它们共享一个通用权限集,您可以添加多个身份池,如下所示:

"StringEquals": { "cognito-identity.amazonaws.com:aud": [ "us-east-1:12345678-abcd-abcd-abcd-123456790ab", "us-east-1:98765432-dcba-dcba-dcba-123456790ab" ] }

限制对特定身份的访问权限

要创建限制为一组特定应用用户的策略,请检查 cognito-identity.amazonaws.com:sub 的值:

"StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-abcd-abcd-abcd-123456790ab", "cognito-identity.amazonaws.com:sub": [ "us-east-1:12345678-1234-1234-1234-123456790ab", "us-east-1:98765432-1234-1234-1243-123456790ab" ] }

限制对特定提供商的访问权限

要创建仅限于已使用特定提供商 (可能是您自己的登录提供商) 登录的用户的策略,请检查 cognito-identity.amazonaws.com:amr 的值:

"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "login.myprovider.myapp" }

例如,一个仅信任 Facebook 的应用程序将具有以下 amr 子句:

"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "graph.facebook.com" }

访问策略

附加到角色的权限对承担该角色的所有用户都有效。如果您希望区分用户的访问权限,则可以通过策略变量来实现。在访问策略中添加用户的身份 ID 时请务必小心,特别是对未经身份验证的身份,因为它们可能会在用户选择登录时发生变化。

为提供额外的安全保护,Amazon Cognito 对 GetCredentialForIdentity 提供的凭证应用范围缩小的策略,以阻止未经身份验证的用户访问除下面列出的服务以外的服务:换句话说,此策略允许使用这些凭证的身份仅访问以下服务:

AWS AppSync

Amazon Comprehend

GameLift

Amazon Lex

Amazon Polly

Amazon SimpleDB

Amazon Transcribe

CloudWatch

DynamoDB

AWS IoT

Amazon Machine Learning

Amazon Rekognition

Amazon SES

Amazon Translate

Amazon Cognito 身份

Amazon Kinesis Data Firehose

AWS KMS Amazon Mobile Analytics

Amazon Sumerian

Amazon SNS

Amazon Cognito Sync

Amazon Kinesis Data Streams

AWS Lambda

Amazon Pinpoint

Amazon S3

Amazon SQS

如果您需要支持未经身份验证的用户访问除这些服务以外的服务,您必须使用基本身份验证流程。如果您收到 NotAuthorizedException,并且您在未经身份验证的角色策略中启用了对该服务的访问权限,那么这可能就是原因所在。

访问策略示例

在此部分中,您可以找到示例 Amazon Cognito 访问策略,这些策略仅授予您的身份完成特定操作所需的权限。您可以在可能的情况下使用策略变量进一步限制给定标识 ID 的权限。例如,使用 ${cognito-identity.amazonaws.com:sub}。有关更多信息,请参阅 AWS Mobile 博客上的了解 Amazon Cognito 身份验证第 3 部分:角色和策略

注意

作为安全性最佳实践,策略应仅包括用户执行其任务所需的权限。这意味着您应该尽可能始终为对象限定单个身份的访问范围。

示例 1:允许身份在 S3 中具有对单个对象的读取访问权限

以下访问策略向身份授予读取权限,以便从给定的 S3 存储桶中检索单个对象。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/assets/my_picture.jpg"] } ] }

示例 2:允许身份在 S3 中对身份特定路径具有读写访问权限

以下访问策略通过将前缀映射到 ${cognito-identity.amazonaws.com:sub} 变量来授予读取和写入权限,以访问 S3 存储桶中的特定前缀“文件夹”。

利用此策略,通过 ${cognito-identity.amazonaws.com:sub} 插入的身份(例如 us-east-1:12345678-1234-1234-1234-123456790ab)将能够在 arn:aws:s3:::mybucket/us-east-1:12345678-1234-1234-1234-123456790ab 中获取、放置和列出对象。但是,不会授予身份访问 arn:aws:s3:::mybucket 中的其他对象的权限。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"] } ] }

示例 3:为 Amazon DynamoDB 分配身份细粒度访问权限

以下访问策略使用 Amazon Cognito 变量为 Amazon DynamoDB 资源提供细粒度访问控制,这些变量通过身份 ID 授予对 DynamoDB 中的项的访问权限。有关更多信息,请参阅 Amazon DynamoDB 开发人员指南 中的使用 IAM 策略条件实现精细访问控制

{ "Version": "2012-10-17", "Statement": [ { "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/MyTable" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } } } ] }

示例 4:允许身份执行 AWS Lambda 函数调用

以下访问策略向身份授予执行 AWS Lambda 函数的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-west-2:123456789012:function:MyFunction" ] } ] }

示例 5:允许身份将记录发布到 Amazon Kinesis 数据流

以下访问策略允许身份将 PutRecord 操作与任何 Kinesis 数据流结合使用。它可以应用于需要将数据记录添加到账户中所有流的用户。有关更多信息,请参阅 Amazon Kinesis 数据流开发人员指南 中的 使用 IAM 控制对 Amazon Kinesis 数据流资源的访问

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kinesis:PutRecord", "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/stream1" ] } ] }

示例 6:允许身份在 Amazon Cognito Sync 存储中访问其数据

以下访问策略仅向身份授予对 Amazon Cognito Sync 存储中其数据的权限。

{ "Version": "2012-10-17", "Statement":[{ "Effect":"Allow", "Action":"cognito-sync:*", "Resource":["arn:aws:cognito-sync:us-east-1:123456789012:identitypool/${cognito-identity.amazonaws.com:aud}/identity/${cognito-identity.amazonaws.com:sub}/*"] }] }