【问题标题】:AWS Cognito iOS Developer Authenticated IdentitiesAWS Cognito iOS 开发人员经过身份验证的身份
【发布时间】:2014-12-05 01:58:33
【问题描述】:

我正在尝试将 amazon cognito 与开发人员身份验证一起使用。我的 API 成功返回了一个 id 和 token。但是,当我使用这些令牌将内容上传到 S3 时,我收到以下错误:

Not authorized to perform sts:AssumeRoleWithWebIdentity

以下是我设置凭据提供程序的代码。

ZGAWSIdentityProvider *identityProvider = [ZGAWSIdentityProvider new];
[identityProvider setIdentityPoolId:AWS_IDENTITY_POOL_ID];

AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
                                           initWithRegionType:AWSRegionUSEast1
                                           identityProvider:identityProvider
                                           unauthRoleArn:AWS_UNAUTH_ROLE_ARN
                                           authRoleArn:AWS_AUTH_ROLE_ARN];


AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:AWSRegionUSWest1
                                                                      credentialsProvider:credentialsProvider];

[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

我正在使用http://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html#create-an-identity-pool-that-supports-developer-authenticated-identities 提供的模板来创建身份提供者。

@implementation ZGAWSIdentityProvider
@synthesize identityPoolId=_identityPoolId;
@synthesize identityId=_identityId;
@synthesize token=_token;


- (BFTask *)getIdentityId {
    // Should ensure that identityId property is valid. The below code can probably
    // be used for most use cases.

    if (self.identityId) {
        return [BFTask taskWithResult:nil];
    } else {
        return [[BFTask taskWithResult:nil] continueWithBlock:^id(BFTask *task) {
            if (!self.identityId) {
                return [self refresh];
            }
            return nil;
        }];
    }
}

- (BFTask *)refresh {

    BFTaskCompletionSource *task = [BFTaskCompletionSource taskCompletionSource];
    __weak __typeof(self)weakSelf = self;
    [[ZGAccountController sharedInstance] getAWSCredentialsWithCompletion:^(NSDictionary *credentials) {

        if (credentials && [credentials objectForKey:@"identity_id"] && [credentials objectForKey:@"identity_id"]) {
            __strong __typeof(weakSelf)strongSelf = weakSelf;
            strongSelf.identityId = [credentials objectForKey:@"identity_id"];
            strongSelf.token = [credentials objectForKey:@"token"];
            [task setResult:nil];
        } else {
            NSError *error = [NSError errorWithDomain:@"com.##.##" code:-1 userInfo:nil];
            [task setError:error];
        }

    }];

    return task.task;
}

@end

这似乎是角色信任的问题。我使用亚马逊网络界面创建了身份池,并仔细检查了身份池 ID 是否正确。我已经能够成功上传 w 未经身份验证的身份,所以我相信不是角色权限问题​​。

【问题讨论】:

  • 可能有点跑题了,但我想问一下在else 块的-getIdentityID 方法中使用return [[BFTask ...]; 而不是简单的return [self refresh]; 的原因是什么?

标签: ios amazon-web-services amazon-s3 amazon-cognito


【解决方案1】:

很抱歉给您带来了麻烦。

身份提供者和凭据提供者的交互方式存在一个小问题,没有正确记录或处理得当。凭据提供程序使用 unauth 或 auth 角色 arn 根据提供程序上是否附加登录信息进行旋转。如果您没有在提供程序上存储任何其他登录信息,它会将其视为未经身份验证并使用 unauth 角色并导致您看到的 STS 错误。您可以通过在身份提供者的刷新中执行以下操作来解决此问题:

// add login to the map to make sure CredentialsProvider treats us as authenticated
NSMutableDictionary *temp = [NSMutableDictionary dictionaryWithDictionary:self.logins];
[temp setObject:@"temp" forKey:@"myprovider"];
self.logins = temp;

2015 年 3 月 10 日更新:您可能需要考虑查看我们的 end-to-end example 以获得更好的处理方法。

这个示例,我们包含用户标识符的实际值,然后将logins 属性的全部内容传递给后端。

【讨论】:

  • 谢谢!这正是问题所在……现在一切正常。
  • 这也救了我,有什么理由不在文档中吗?
  • 我们正在努力更新文档以及说明性的端到端示例。
  • @BobKinney 有什么方法可以提供更多背景信息吗?您是否真的将值设置为@"temp" 是应该是我的“开发者提供者名称”的键 分配它是否有一个设置器?我可以在我的AWSAbstractIdentityProvider sublass 的 getter 上返回它吗?
  • @RyanRomanchuk 我用额外的上下文和端到端示例的链接更新了我的答案。希望fhi有所帮助。
【解决方案2】:

如果您能够在未经身份验证的情况下成功执行此操作,这里有几种可能性。

首先,确保您的未经身份验证的角色 arn 与您的已验证角色 arn 不同。 此外,确保在信任策略中(可通过this link 的适当角色访问),amr 指向“已验证”。

如果您有任何其他问题,this blog post 会在高级别上详细介绍该过程。

【讨论】:

  • 我已经关注了上面链接的博客文章,确保未经身份验证的角色 arn 与我的身份验证角色 arn 不同,但仍然没有成功。但是,当我将 unauthRoleArn 设置为与 authRoleArn 相同的 时,我能够成功发布到 AWS,但我不明白为什么这样做/部署它感觉不舒服。跨度>
  • 您能否确认您的信任策略 amr 指向已验证?
猜你喜欢
  • 2016-06-29
  • 2015-05-10
  • 1970-01-01
  • 2018-05-17
  • 2015-04-15
  • 1970-01-01
  • 2015-10-04
  • 2016-01-16
  • 2016-03-12
相关资源
最近更新 更多