Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon 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 策略概述。为使 Amazon Cognito 正常运行,IAM 策略必须至少允许各个身份访问 Amazon Cognito 存储空间,如以下示例中所示:

{ "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}/*"] }] }

以下策略可以提供对整个 Amazon Cognito Sync 存储空间的访问权限:

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

角色信任和权限

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 提供的凭证应用范围缩小的策略,以阻止未经身份验证的用户访问除以下服务以外的服务:

  • CloudWatch

  • Amazon Cognito 身份

  • Amazon Cognito Sync

  • DynamoDB

  • Amazon Kinesis Data Firehose

  • GameLift

  • AWS IoT

  • Amazon Kinesis Data Streams

  • AWS KMS

  • AWS Lambda

  • Amazon Lex

  • Amazon Machine Learning

  • Amazon Mobile Analytics

  • Amazon Polly

  • Amazon Rekognition

  • Amazon S3

  • Amazon SimpleDB

  • Amazon SES

  • Amazon SNS

  • Amazon SQS

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

S3 前缀

您可以为用户提供 S3 存储桶中的一个特定前缀“folder”,方法是将该前缀映射到 ${cognito-identity.amazonaws.com:sub} 变量:

{ "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}/*"] } ] }

对 Amazon DynamoDB 的精细访问权限

您可以使用 Amazon Cognito 变量对 Amazon DynamoDB 资源提供精细的访问控制。只需按身份 ID 授予对 DynamoDB 中项目的访问权限:

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