Cognito/IAM 策略和 S3 获取对象

Posted

技术标签:

【中文标题】Cognito/IAM 策略和 S3 获取对象【英文标题】:Cognito/IAM Policies & S3 Get Object 【发布时间】:2014-10-08 04:35:39 【问题描述】:

我正在尝试将 S3 和 Cognito 集成到我的 ios 应用程序中,但目前还没有成功。我相信该错误与我的 IAM Auth 和 Unauth 用户政策有关。所以这是我的政策:


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

这里是我调用 S3 的地方:

    AWSS3GetObjectRequest *getObjectRequest = [[AWSS3GetObjectRequest alloc] init];
    getObjectRequest.key = KEY;
    getObjectRequest.bucket = BUCKET;

    //default service has been configured previously
    AWSS3 *s3 = [[AWSS3 new] initWithConfiguration:[AWSServiceManager defaultServiceManager].defaultServiceConfiguration];

    [[s3 getObject:getObjectRequest] continueWithBlock:^id(BFTask *task) 
        if(task.error)
        
            NSLog(@"Error: %@",task.error);
        
        else
        
            NSLog(@"Got File");
            NSData *data = [task.result body];
            NSString *urlString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSURL *url = [[NSURL alloc] initWithString:urlString];
            if ([[UIApplication sharedApplication] canOpenURL:url]) 
                [[UIApplication sharedApplication] openURL:url];
            

        
        return nil;
    ];

这是错误:

错误:错误 Domain=com.amazonaws.AWSSTSErrorDomain Code=0 "AccessDenied -- 无权执行 sts:AssumeRoleWithWebIdentity" UserInfo=0x10a23e0a0 NSLocalizedDescription=AccessDenied -- 无权执行 sts:AssumeRoleWithWebIdentity

那么,我做错了什么?

【问题讨论】:

你好,我的朋友。据我所知,您没有经过适当的身份验证。请说明您如何使用由同源提供的身份验证。 【参考方案1】:

您遇到的错误

Not authorized to perform sts:AssumeRoleWithWebIdentity

是由于您的信任政策错误,而不是您的访问政策错误。

这是作为 Cognito 设置向导的一部分创建的角色吗?您是否以任何方式修改了角色? Cognito 控制台创建的角色被固定到创建它的特定身份池。确保您使用的角色是通过您在应用程序中使用的身份池创建的。

【讨论】:

我有同样的问题 - 我的角色是使用向导创建的。我们可以使用什么信任策略来完成这个非常简单的事情? @AnnaBillstrom 您是否创建了一个与以前的池同名的新池?不幸的是,存在控制台无法根据新池身份池 ID 更新角色的问题。 This blog post 显示了用于 Cognito 的示例信任策略。这些必须通过IAM console 设置。 @AnnaBillstrom 你能发布一个关于你的配置细节的新问题吗?或者在我们的论坛上,以便我们可以访问您的帐户详细信息? 当然——昨天发布了这个(并解决了它)***.com/questions/28178541/…,但很想知道你的想法。我的解决方案 - s3 存储桶不是“美国标准”和其他 2 个更改。 @AnnaBillstrom 为该帖子添加了答案。希望它有助于澄清事情。

以上是关于Cognito/IAM 策略和 S3 获取对象的主要内容,如果未能解决你的问题,请参考以下文章

允许用户放置、获取、删除和修改权限的 S3 策略

S3 删除目录上的对象策略

s3 存储桶策略 chrome 错误

AWS S3 CLI - 如何使用存储桶上设置的所有当前策略获取 JSON?

AWS S3策略限制用户仅列出存储桶中的某些文件夹

令人困惑的 s3 存储桶策略上传问题